mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 22:41:50 +00:00
Rollup merge of #119813 - oli-obk:even_more_follow_up_errors2, r=estebank
Silence some follow-up errors [2/x] this is one piece of the requested cleanups from https://github.com/rust-lang/rust/pull/117449 the `type_of` query frequently uses astconv to convert a `hir::Ty` to a `ty::Ty`. This process is infallible, but may produce errors as it goes. All the error reporting sites that had access to the `ItemCtxt` are now tainting it, causing `type_of` to return a `ty::Error` instead of anything else.
This commit is contained in:
commit
bd61caf58b
@ -300,13 +300,15 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
||||
.expect("missing associated item");
|
||||
|
||||
if !assoc_item.visibility(tcx).is_accessible_from(def_scope, tcx) {
|
||||
tcx.dcx()
|
||||
let reported = tcx
|
||||
.dcx()
|
||||
.struct_span_err(
|
||||
binding.span,
|
||||
format!("{} `{}` is private", assoc_item.kind, binding.item_name),
|
||||
)
|
||||
.with_span_label(binding.span, format!("private {}", assoc_item.kind))
|
||||
.emit();
|
||||
self.set_tainted_by_errors(reported);
|
||||
}
|
||||
tcx.check_stability(assoc_item.def_id, Some(hir_ref_id), binding.span, None);
|
||||
|
||||
|
@ -354,7 +354,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
);
|
||||
err.span_label(name.span, format!("multiple `{name}` found"));
|
||||
self.note_ambiguous_inherent_assoc_type(&mut err, candidates, span);
|
||||
err.emit()
|
||||
let reported = err.emit();
|
||||
self.set_tainted_by_errors(reported);
|
||||
reported
|
||||
}
|
||||
|
||||
// FIXME(fmease): Heavily adapted from `rustc_hir_typeck::method::suggest`. Deduplicate.
|
||||
@ -843,7 +845,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
}
|
||||
}
|
||||
|
||||
err.emit();
|
||||
self.set_tainted_by_errors(err.emit());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -390,6 +390,12 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
infer_args,
|
||||
);
|
||||
|
||||
if let Err(err) = &arg_count.correct
|
||||
&& let Some(reported) = err.reported
|
||||
{
|
||||
self.set_tainted_by_errors(reported);
|
||||
}
|
||||
|
||||
// Skip processing if type has no generic parameters.
|
||||
// Traits always have `Self` as a generic parameter, which means they will not return early
|
||||
// here and so associated type bindings will be handled regardless of whether there are any
|
||||
@ -568,6 +574,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
span,
|
||||
modifier: constness.as_str(),
|
||||
});
|
||||
self.set_tainted_by_errors(e);
|
||||
arg_count.correct =
|
||||
Err(GenericArgCountMismatch { reported: Some(e), invalid_args: vec![] });
|
||||
}
|
||||
@ -966,7 +973,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
}
|
||||
}
|
||||
}
|
||||
err.emit()
|
||||
let reported = err.emit();
|
||||
self.set_tainted_by_errors(reported);
|
||||
reported
|
||||
}
|
||||
|
||||
// Search for a bound on a type parameter which includes the associated item
|
||||
@ -1043,6 +1052,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
span,
|
||||
binding,
|
||||
);
|
||||
self.set_tainted_by_errors(reported);
|
||||
return Err(reported);
|
||||
};
|
||||
debug!(?bound);
|
||||
@ -1120,6 +1130,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
));
|
||||
}
|
||||
let reported = err.emit();
|
||||
self.set_tainted_by_errors(reported);
|
||||
if !where_bounds.is_empty() {
|
||||
return Err(reported);
|
||||
}
|
||||
@ -1374,6 +1385,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
assoc_ident.name,
|
||||
)
|
||||
};
|
||||
self.set_tainted_by_errors(reported);
|
||||
return Err(reported);
|
||||
}
|
||||
};
|
||||
@ -1616,12 +1628,14 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
let kind = tcx.def_kind_descr(kind, item);
|
||||
let msg = format!("{kind} `{name}` is private");
|
||||
let def_span = tcx.def_span(item);
|
||||
tcx.dcx()
|
||||
let reported = tcx
|
||||
.dcx()
|
||||
.struct_span_err(span, msg)
|
||||
.with_code(rustc_errors::error_code!(E0624))
|
||||
.with_span_label(span, format!("private {kind}"))
|
||||
.with_span_label(def_span, format!("{kind} defined here"))
|
||||
.emit();
|
||||
self.set_tainted_by_errors(reported);
|
||||
}
|
||||
tcx.check_stability(item, Some(block), span, None);
|
||||
}
|
||||
@ -1862,7 +1876,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
err.span_label(span, format!("not allowed on {what}"));
|
||||
}
|
||||
extend(&mut err);
|
||||
err.emit();
|
||||
self.set_tainted_by_errors(err.emit());
|
||||
emitted = true;
|
||||
}
|
||||
|
||||
@ -2184,7 +2198,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
{
|
||||
err.span_note(impl_.self_ty.span, "not a concrete type");
|
||||
}
|
||||
Ty::new_error(tcx, err.emit())
|
||||
let reported = err.emit();
|
||||
self.set_tainted_by_errors(reported);
|
||||
Ty::new_error(tcx, reported)
|
||||
} else {
|
||||
ty
|
||||
}
|
||||
@ -2586,7 +2602,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
);
|
||||
}
|
||||
|
||||
diag.emit();
|
||||
self.set_tainted_by_errors(diag.emit());
|
||||
}
|
||||
|
||||
// Find any late-bound regions declared in return type that do
|
||||
@ -2686,7 +2702,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
err.note("consider introducing a named lifetime parameter");
|
||||
}
|
||||
|
||||
err.emit();
|
||||
self.set_tainted_by_errors(err.emit());
|
||||
}
|
||||
}
|
||||
|
||||
@ -2725,7 +2741,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
// error.
|
||||
let r = derived_region_bounds[0];
|
||||
if derived_region_bounds[1..].iter().any(|r1| r != *r1) {
|
||||
tcx.dcx().emit_err(AmbiguousLifetimeBound { span });
|
||||
self.set_tainted_by_errors(tcx.dcx().emit_err(AmbiguousLifetimeBound { span }));
|
||||
}
|
||||
Some(r)
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
for more information on them, visit \
|
||||
<https://doc.rust-lang.org/reference/special-types-and-traits.html#auto-traits>",
|
||||
);
|
||||
err.emit();
|
||||
self.set_tainted_by_errors(err.emit());
|
||||
}
|
||||
|
||||
if regular_traits.is_empty() && auto_traits.is_empty() {
|
||||
@ -127,6 +127,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
.map(|trait_ref| tcx.def_span(trait_ref));
|
||||
let reported =
|
||||
tcx.dcx().emit_err(TraitObjectDeclaredWithNoTraits { span, trait_alias_span });
|
||||
self.set_tainted_by_errors(reported);
|
||||
return Ty::new_error(tcx, reported);
|
||||
}
|
||||
|
||||
@ -290,7 +291,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
|
||||
if references_self {
|
||||
let def_id = i.bottom().0.def_id();
|
||||
struct_span_code_err!(
|
||||
let reported = struct_span_code_err!(
|
||||
tcx.dcx(),
|
||||
i.bottom().1,
|
||||
E0038,
|
||||
@ -303,6 +304,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
.error_msg(),
|
||||
)
|
||||
.emit();
|
||||
self.set_tainted_by_errors(reported);
|
||||
}
|
||||
|
||||
ty::ExistentialTraitRef { def_id: trait_ref.def_id, args }
|
||||
@ -389,6 +391,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
} else {
|
||||
err.emit()
|
||||
};
|
||||
self.set_tainted_by_errors(e);
|
||||
ty::Region::new_error(tcx, e)
|
||||
})
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ use rustc_target::spec::abi;
|
||||
use rustc_trait_selection::infer::InferCtxtExt;
|
||||
use rustc_trait_selection::traits::error_reporting::suggestions::NextTypeParamName;
|
||||
use rustc_trait_selection::traits::ObligationCtxt;
|
||||
use std::cell::Cell;
|
||||
use std::iter;
|
||||
use std::ops::Bound;
|
||||
|
||||
@ -119,6 +120,7 @@ pub fn provide(providers: &mut Providers) {
|
||||
pub struct ItemCtxt<'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
item_def_id: LocalDefId,
|
||||
tainted_by_errors: Cell<Option<ErrorGuaranteed>>,
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@ -343,7 +345,7 @@ fn bad_placeholder<'tcx>(
|
||||
|
||||
impl<'tcx> ItemCtxt<'tcx> {
|
||||
pub fn new(tcx: TyCtxt<'tcx>, item_def_id: LocalDefId) -> ItemCtxt<'tcx> {
|
||||
ItemCtxt { tcx, item_def_id }
|
||||
ItemCtxt { tcx, item_def_id, tainted_by_errors: Cell::new(None) }
|
||||
}
|
||||
|
||||
pub fn to_ty(&self, ast_ty: &hir::Ty<'_>) -> Ty<'tcx> {
|
||||
@ -357,6 +359,13 @@ impl<'tcx> ItemCtxt<'tcx> {
|
||||
pub fn node(&self) -> hir::Node<'tcx> {
|
||||
self.tcx.hir_node(self.hir_id())
|
||||
}
|
||||
|
||||
fn check_tainted_by_errors(&self) -> Result<(), ErrorGuaranteed> {
|
||||
match self.tainted_by_errors.get() {
|
||||
Some(err) => Err(err),
|
||||
None => Ok(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> AstConv<'tcx> for ItemCtxt<'tcx> {
|
||||
@ -492,8 +501,8 @@ impl<'tcx> AstConv<'tcx> for ItemCtxt<'tcx> {
|
||||
ty.ty_adt_def()
|
||||
}
|
||||
|
||||
fn set_tainted_by_errors(&self, _: ErrorGuaranteed) {
|
||||
// There's no obvious place to track this, so just let it go.
|
||||
fn set_tainted_by_errors(&self, err: ErrorGuaranteed) {
|
||||
self.tainted_by_errors.set(Some(err));
|
||||
}
|
||||
|
||||
fn record_ty(&self, _hir_id: hir::HirId, _ty: Ty<'tcx>, _span: Span) {
|
||||
|
@ -513,7 +513,11 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||
bug!("unexpected sort of node in type_of(): {:?}", x);
|
||||
}
|
||||
};
|
||||
ty::EarlyBinder::bind(output)
|
||||
if let Err(e) = icx.check_tainted_by_errors() {
|
||||
ty::EarlyBinder::bind(Ty::new_error(tcx, e))
|
||||
} else {
|
||||
ty::EarlyBinder::bind(output)
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn type_of_opaque(
|
||||
|
@ -802,7 +802,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
.explicit_item_bounds(def_id)
|
||||
.iter_instantiated_copied(self.tcx, args)
|
||||
.find_map(|(p, s)| get_future_output(p.as_predicate(), s))?,
|
||||
ty::Error(_) => return None,
|
||||
ty::Error(_) => return Some(ret_ty),
|
||||
_ => span_bug!(
|
||||
closure_span,
|
||||
"async fn coroutine return type not an inference variable: {ret_ty}"
|
||||
|
@ -4,7 +4,6 @@ pub struct Foo<'a, 'b, T> {
|
||||
field1: dyn Bar<'a, 'b,>,
|
||||
//~^ ERROR
|
||||
//~| ERROR
|
||||
//~| ERROR
|
||||
}
|
||||
|
||||
pub trait Bar<'x, 's, U>
|
||||
|
@ -5,7 +5,7 @@ LL | field1: dyn Bar<'a, 'b,>,
|
||||
| ^^^ expected 1 generic argument
|
||||
|
|
||||
note: trait defined here, with 1 generic parameter: `U`
|
||||
--> $DIR/unable-fulfill-trait.rs:10:11
|
||||
--> $DIR/unable-fulfill-trait.rs:9:11
|
||||
|
|
||||
LL | pub trait Bar<'x, 's, U>
|
||||
| ^^^ -
|
||||
@ -20,24 +20,7 @@ error[E0227]: ambiguous lifetime bound, explicit lifetime bound required
|
||||
LL | field1: dyn Bar<'a, 'b,>,
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0478]: lifetime bound not satisfied
|
||||
--> $DIR/unable-fulfill-trait.rs:4:13
|
||||
|
|
||||
LL | field1: dyn Bar<'a, 'b,>,
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: lifetime parameter instantiated with the lifetime `'b` as defined here
|
||||
--> $DIR/unable-fulfill-trait.rs:3:20
|
||||
|
|
||||
LL | pub struct Foo<'a, 'b, T> {
|
||||
| ^^
|
||||
note: but lifetime parameter must outlive the lifetime `'a` as defined here
|
||||
--> $DIR/unable-fulfill-trait.rs:3:16
|
||||
|
|
||||
LL | pub struct Foo<'a, 'b, T> {
|
||||
| ^^
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0107, E0227, E0478.
|
||||
Some errors have detailed explanations: E0107, E0227.
|
||||
For more information about an error, try `rustc --explain E0107`.
|
||||
|
@ -30,7 +30,7 @@ LL | type Item = &[T];
|
||||
= help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
|
||||
|
||||
error[E0223]: ambiguous associated type
|
||||
--> $DIR/issue-109071.rs:16:22
|
||||
--> $DIR/issue-109071.rs:15:22
|
||||
|
|
||||
LL | fn T() -> Option<Self::Item> {}
|
||||
| ^^^^^^^^^^
|
||||
|
@ -9,13 +9,11 @@ impl<T> Windows { //~ ERROR: missing generics for struct `Windows`
|
||||
//[no_gate]~^ ERROR: inherent associated types are unstable
|
||||
|
||||
fn next() -> Option<Self::Item> {}
|
||||
//[with_gate]~^ ERROR type annotations needed
|
||||
}
|
||||
|
||||
impl<T> Windows<T> {
|
||||
fn T() -> Option<Self::Item> {}
|
||||
//[no_gate]~^ ERROR: ambiguous associated type
|
||||
//[with_gate]~^^ ERROR type annotations needed
|
||||
//~^ ERROR: ambiguous associated type
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -20,19 +20,20 @@ help: add missing generic argument
|
||||
LL | impl<T> Windows<T> {
|
||||
| +++
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/issue-109071.rs:11:18
|
||||
|
|
||||
LL | fn next() -> Option<Self::Item> {}
|
||||
| ^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T`
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/issue-109071.rs:16:15
|
||||
error[E0223]: ambiguous associated type
|
||||
--> $DIR/issue-109071.rs:15:22
|
||||
|
|
||||
LL | fn T() -> Option<Self::Item> {}
|
||||
| ^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T`
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
help: use fully-qualified syntax
|
||||
|
|
||||
LL | fn T() -> Option<<Windows<T> as IntoAsyncIterator>::Item> {}
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
LL | fn T() -> Option<<Windows<T> as IntoIterator>::Item> {}
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0107, E0282, E0637.
|
||||
Some errors have detailed explanations: E0107, E0223, E0637.
|
||||
For more information about an error, try `rustc --explain E0107`.
|
||||
|
@ -5,9 +5,8 @@ use std::ops::Index;
|
||||
trait Hierarchy {
|
||||
type Value;
|
||||
type ChildKey;
|
||||
type Children = dyn Index<Self::ChildKey, Output=dyn Hierarchy>;
|
||||
type Children = dyn Index<Self::ChildKey, Output = dyn Hierarchy>;
|
||||
//~^ ERROR: the value of the associated types
|
||||
//~| ERROR: the size for values of type
|
||||
|
||||
fn data(&self) -> Option<(Self::Value, Self::Children)>;
|
||||
}
|
||||
|
@ -1,27 +1,13 @@
|
||||
error[E0191]: the value of the associated types `Value`, `ChildKey` and `Children` in `Hierarchy` must be specified
|
||||
--> $DIR/issue-23595-1.rs:8:58
|
||||
--> $DIR/issue-23595-1.rs:8:60
|
||||
|
|
||||
LL | type Value;
|
||||
| ---------- `Value` defined here
|
||||
LL | type ChildKey;
|
||||
| ------------- `ChildKey` defined here
|
||||
LL | type Children = dyn Index<Self::ChildKey, Output=dyn Hierarchy>;
|
||||
| ------------- `Children` defined here ^^^^^^^^^ help: specify the associated types: `Hierarchy<Value = Type, ChildKey = Type, Children = Type>`
|
||||
LL | type Children = dyn Index<Self::ChildKey, Output = dyn Hierarchy>;
|
||||
| ------------- `Children` defined here ^^^^^^^^^ help: specify the associated types: `Hierarchy<Value = Type, ChildKey = Type, Children = Type>`
|
||||
|
||||
error[E0277]: the size for values of type `(dyn Index<<Self as Hierarchy>::ChildKey, Output = (dyn Hierarchy + 'static)> + 'static)` cannot be known at compilation time
|
||||
--> $DIR/issue-23595-1.rs:8:21
|
||||
|
|
||||
LL | type Children = dyn Index<Self::ChildKey, Output=dyn Hierarchy>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `(dyn Index<<Self as Hierarchy>::ChildKey, Output = (dyn Hierarchy + 'static)> + 'static)`
|
||||
note: required by a bound in `Hierarchy::Children`
|
||||
--> $DIR/issue-23595-1.rs:8:5
|
||||
|
|
||||
LL | type Children = dyn Index<Self::ChildKey, Output=dyn Hierarchy>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `Hierarchy::Children`
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0191, E0277.
|
||||
For more information about an error, try `rustc --explain E0191`.
|
||||
For more information about this error, try `rustc --explain E0191`.
|
||||
|
@ -7,7 +7,7 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
|
||||
= note: type parameters may not be used in the type of const parameters
|
||||
|
||||
error[E0770]: the type of const parameters must not depend on other generic parameters
|
||||
--> $DIR/issue-71381.rs:23:40
|
||||
--> $DIR/issue-71381.rs:22:40
|
||||
|
|
||||
LL | const FN: unsafe extern "C" fn(Args),
|
||||
| ^^^^ the type must not depend on the parameter `Args`
|
||||
|
@ -7,29 +7,13 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
|
||||
= note: type parameters may not be used in the type of const parameters
|
||||
|
||||
error[E0770]: the type of const parameters must not depend on other generic parameters
|
||||
--> $DIR/issue-71381.rs:23:40
|
||||
--> $DIR/issue-71381.rs:22:40
|
||||
|
|
||||
LL | const FN: unsafe extern "C" fn(Args),
|
||||
| ^^^^ the type must not depend on the parameter `Args`
|
||||
|
|
||||
= note: type parameters may not be used in the type of const parameters
|
||||
|
||||
error: using function pointers as const generic parameters is forbidden
|
||||
--> $DIR/issue-71381.rs:14:61
|
||||
|
|
||||
LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&self) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool` and `char`
|
||||
|
||||
error: using function pointers as const generic parameters is forbidden
|
||||
--> $DIR/issue-71381.rs:23:19
|
||||
|
|
||||
LL | const FN: unsafe extern "C" fn(Args),
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool` and `char`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0770`.
|
||||
|
@ -12,8 +12,7 @@ unsafe extern "C" fn pass(args: PassArg) {
|
||||
|
||||
impl Test {
|
||||
pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&self) {
|
||||
//[min]~^ ERROR: using function pointers as const generic parameters is forbidden
|
||||
//~^^ ERROR: the type of const parameters must not depend on other generic parameters
|
||||
//~^ ERROR: the type of const parameters must not depend on other generic parameters
|
||||
self.0 = Self::trampiline::<Args, IDX, FN> as _
|
||||
}
|
||||
|
||||
@ -21,8 +20,7 @@ impl Test {
|
||||
Args: Sized,
|
||||
const IDX: usize,
|
||||
const FN: unsafe extern "C" fn(Args),
|
||||
//[min]~^ ERROR: using function pointers as const generic parameters is forbidden
|
||||
//~^^ ERROR: the type of const parameters must not depend on other generic parameters
|
||||
//~^ ERROR: the type of const parameters must not depend on other generic parameters
|
||||
>(
|
||||
args: Args,
|
||||
) {
|
||||
|
@ -6,14 +6,6 @@ LL | fn func<A, const F: fn(inner: A)>(outer: A) {
|
||||
|
|
||||
= note: type parameters may not be used in the type of const parameters
|
||||
|
||||
error: using function pointers as const generic parameters is forbidden
|
||||
--> $DIR/issue-71611.rs:5:21
|
||||
|
|
||||
LL | fn func<A, const F: fn(inner: A)>(outer: A) {
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool` and `char`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0770`.
|
||||
|
@ -3,8 +3,7 @@
|
||||
#![cfg_attr(full, allow(incomplete_features))]
|
||||
|
||||
fn func<A, const F: fn(inner: A)>(outer: A) {
|
||||
//[min]~^ ERROR: using function pointers as const generic parameters is forbidden
|
||||
//~^^ ERROR: the type of const parameters must not depend on other generic parameters
|
||||
//~^ ERROR: the type of const parameters must not depend on other generic parameters
|
||||
F(outer);
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,6 @@ use std::fmt::Debug;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Irrelevant<Irrelevant> { //~ ERROR type arguments are not allowed on type parameter
|
||||
//~^ ERROR `Irrelevant` must be used
|
||||
irrelevant: Irrelevant,
|
||||
}
|
||||
|
||||
|
@ -16,16 +16,6 @@ LL | pub struct Irrelevant<Irrelevant> {
|
||||
| ^^^^^^^^^^
|
||||
= note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0210]: type parameter `Irrelevant` must be used as the type parameter for some local type (e.g., `MyStruct<Irrelevant>`)
|
||||
--> $DIR/issue-97343.rs:4:23
|
||||
|
|
||||
LL | pub struct Irrelevant<Irrelevant> {
|
||||
| ^^^^^^^^^^ type parameter `Irrelevant` must be used as the type parameter for some local type
|
||||
|
|
||||
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
|
||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0109, E0210.
|
||||
For more information about an error, try `rustc --explain E0109`.
|
||||
For more information about this error, try `rustc --explain E0109`.
|
||||
|
@ -6,8 +6,6 @@ trait FooBar<'foo, 'bar>: Foo<'foo> + Bar<'bar> {}
|
||||
struct Baz<'foo, 'bar> {
|
||||
baz: dyn FooBar<'foo, 'bar>,
|
||||
//~^ ERROR ambiguous lifetime bound, explicit lifetime bound required
|
||||
//~| ERROR lifetime bound not satisfied
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
||||
fn main() {}
|
||||
|
@ -4,24 +4,6 @@ error[E0227]: ambiguous lifetime bound, explicit lifetime bound required
|
||||
LL | baz: dyn FooBar<'foo, 'bar>,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0478]: lifetime bound not satisfied
|
||||
--> $DIR/E0227.rs:7:10
|
||||
|
|
||||
LL | baz: dyn FooBar<'foo, 'bar>,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: lifetime parameter instantiated with the lifetime `'bar` as defined here
|
||||
--> $DIR/E0227.rs:6:18
|
||||
|
|
||||
LL | struct Baz<'foo, 'bar> {
|
||||
| ^^^^
|
||||
note: but lifetime parameter must outlive the lifetime `'foo` as defined here
|
||||
--> $DIR/E0227.rs:6:12
|
||||
|
|
||||
LL | struct Baz<'foo, 'bar> {
|
||||
| ^^^^
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0227, E0478.
|
||||
For more information about an error, try `rustc --explain E0227`.
|
||||
For more information about this error, try `rustc --explain E0227`.
|
||||
|
@ -9,9 +9,6 @@ impl Provider for () {
|
||||
struct Holder<B> {
|
||||
inner: Box<dyn Provider<A = B>>,
|
||||
//~^ ERROR: missing generics for associated type
|
||||
//~| ERROR: missing generics for associated type
|
||||
//~| ERROR: missing generics for associated type
|
||||
//~| ERROR: the trait `Provider` cannot be made into an object
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
@ -14,57 +14,6 @@ help: add missing lifetime argument
|
||||
LL | inner: Box<dyn Provider<A<'a> = B>>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `Provider::A`
|
||||
--> $DIR/issue-71176.rs:10:27
|
||||
|
|
||||
LL | inner: Box<dyn Provider<A = B>>,
|
||||
| ^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-71176.rs:2:10
|
||||
|
|
||||
LL | type A<'a>;
|
||||
| ^ --
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: add missing lifetime argument
|
||||
|
|
||||
LL | inner: Box<dyn Provider<A<'a> = B>>,
|
||||
| ++++
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error[E0107]: missing generics for associated type `Provider::A`
|
||||
--> $DIR/issue-71176.rs:10:27
|
||||
|
|
||||
LL | inner: Box<dyn Provider<A = B>>,
|
||||
| ^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-71176.rs:2:10
|
||||
|
|
||||
LL | type A<'a>;
|
||||
| ^ --
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: add missing lifetime argument
|
||||
|
|
||||
LL | inner: Box<dyn Provider<A<'a> = B>>,
|
||||
| ++++
|
||||
|
||||
error[E0038]: the trait `Provider` cannot be made into an object
|
||||
--> $DIR/issue-71176.rs:10:14
|
||||
|
|
||||
LL | inner: Box<dyn Provider<A = B>>,
|
||||
| ^^^^^^^^^^^^^^^^^^^ `Provider` cannot be made into an object
|
||||
|
|
||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||
--> $DIR/issue-71176.rs:2:10
|
||||
|
|
||||
LL | trait Provider {
|
||||
| -------- this trait cannot be made into an object...
|
||||
LL | type A<'a>;
|
||||
| ^ ...because it contains the generic associated type `A`
|
||||
= help: consider moving `A` to another trait
|
||||
= help: only type `()` implements the trait, consider using it directly instead
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0038, E0107.
|
||||
For more information about an error, try `rustc --explain E0038`.
|
||||
For more information about this error, try `rustc --explain E0107`.
|
||||
|
@ -5,7 +5,6 @@ fn foo<T>() {
|
||||
|
||||
impl<T> Drop for Foo<T> {
|
||||
//~^ ERROR struct takes 0 generic arguments but 1 generic argument
|
||||
//~| ERROR `T` is not constrained
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
}
|
||||
|
@ -22,13 +22,7 @@ note: struct defined here, with 0 generic parameters
|
||||
LL | struct Foo {
|
||||
| ^^^
|
||||
|
||||
error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
|
||||
--> $DIR/issue-3214.rs:6:10
|
||||
|
|
||||
LL | impl<T> Drop for Foo<T> {
|
||||
| ^ unconstrained type parameter
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0107, E0207, E0401.
|
||||
Some errors have detailed explanations: E0107, E0401.
|
||||
For more information about an error, try `rustc --explain E0107`.
|
||||
|
@ -8,8 +8,6 @@ static FOO: (dyn AsRef<OsStr>, u8) = ("hello", 42);
|
||||
|
||||
const BAR: (&Path, [u8], usize) = ("hello", [], 42);
|
||||
//~^ ERROR cannot find type `Path` in this scope
|
||||
//~| ERROR the size for values of type `[u8]` cannot be known at compilation time
|
||||
//~| ERROR mismatched types
|
||||
|
||||
static BAZ: ([u8], usize) = ([], 0);
|
||||
//~^ ERROR the size for values of type `[u8]` cannot be known at compilation time
|
||||
|
@ -21,25 +21,7 @@ LL + use std::path::Path;
|
||||
|
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/issue-84108.rs:9:12
|
||||
|
|
||||
LL | const BAR: (&Path, [u8], usize) = ("hello", [], 42);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: only the last element of a tuple may have a dynamically sized type
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-84108.rs:9:45
|
||||
|
|
||||
LL | const BAR: (&Path, [u8], usize) = ("hello", [], 42);
|
||||
| ^^ expected `[u8]`, found `[_; 0]`
|
||||
|
|
||||
= note: expected slice `[u8]`
|
||||
found array `[_; 0]`
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/issue-84108.rs:14:13
|
||||
--> $DIR/issue-84108.rs:12:13
|
||||
|
|
||||
LL | static BAZ: ([u8], usize) = ([], 0);
|
||||
| ^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
@ -48,7 +30,7 @@ LL | static BAZ: ([u8], usize) = ([], 0);
|
||||
= note: only the last element of a tuple may have a dynamically sized type
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-84108.rs:14:30
|
||||
--> $DIR/issue-84108.rs:12:30
|
||||
|
|
||||
LL | static BAZ: ([u8], usize) = ([], 0);
|
||||
| ^^ expected `[u8]`, found `[_; 0]`
|
||||
@ -56,7 +38,7 @@ LL | static BAZ: ([u8], usize) = ([], 0);
|
||||
= note: expected slice `[u8]`
|
||||
found array `[_; 0]`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0277, E0308, E0412.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
||||
|
@ -28,6 +28,5 @@ fn d<const C: S>() {}
|
||||
trait Foo<'a> {}
|
||||
struct Bar<const N: &'a (dyn for<'a> Foo<'a>)>;
|
||||
//~^ ERROR the type of const parameters must not depend on other generic parameters
|
||||
//~| ERROR `&dyn for<'a> Foo<'a>` is forbidden as the type of a const generic parameter
|
||||
|
||||
fn main() {}
|
||||
|
@ -58,16 +58,7 @@ LL | fn d<const C: S>() {}
|
||||
= note: the only supported types are integers, `bool` and `char`
|
||||
= help: add `#![feature(adt_const_params)]` to the crate attributes to enable more complex and user defined types
|
||||
|
||||
error: `&dyn for<'a> Foo<'a>` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/unusual-rib-combinations.rs:29:21
|
||||
|
|
||||
LL | struct Bar<const N: &'a (dyn for<'a> Foo<'a>)>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool` and `char`
|
||||
= help: add `#![feature(adt_const_params)]` to the crate attributes to enable more complex and user defined types
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0106, E0214, E0308, E0770.
|
||||
For more information about an error, try `rustc --explain E0106`.
|
||||
|
@ -5,4 +5,3 @@ struct Apple((Apple, Option(Banana ? Citron)));
|
||||
//~| ERROR expected one of `)` or `,`, found `Citron`
|
||||
//~| ERROR cannot find type `Citron` in this scope [E0412]
|
||||
//~| ERROR parenthesized type parameters may only be used with a `Fn` trait [E0214]
|
||||
//~| ERROR recursive type `Apple` has infinite size [E0072]
|
||||
|
@ -34,18 +34,7 @@ help: use angle brackets instead
|
||||
LL | struct Apple((Apple, Option<Banana ? Citron>));
|
||||
| ~ ~
|
||||
|
||||
error[E0072]: recursive type `Apple` has infinite size
|
||||
--> $DIR/issue-103748-ICE-wrong-braces.rs:3:1
|
||||
|
|
||||
LL | struct Apple((Apple, Option(Banana ? Citron)));
|
||||
| ^^^^^^^^^^^^ ----- recursive without indirection
|
||||
|
|
||||
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
|
||||
|
|
||||
LL | struct Apple((Box<Apple>, Option(Banana ? Citron)));
|
||||
| ++++ +
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0072, E0214, E0412.
|
||||
For more information about an error, try `rustc --explain E0072`.
|
||||
Some errors have detailed explanations: E0214, E0412.
|
||||
For more information about an error, try `rustc --explain E0214`.
|
||||
|
@ -39,7 +39,6 @@ impl<T: Trait<u32, String>> Struct<T> {}
|
||||
trait YetAnotherTrait {}
|
||||
impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {}
|
||||
//~^ ERROR struct takes 1 generic argument but 2 generic arguments were supplied
|
||||
//~| ERROR `U` is not constrained
|
||||
|
||||
|
||||
fn main() {
|
||||
|
@ -116,13 +116,7 @@ error[E0207]: the type parameter `S` is not constrained by the impl trait, self
|
||||
LL | impl<T, S> Trait<T, S> for () {}
|
||||
| ^ unconstrained type parameter
|
||||
|
||||
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:40:35
|
||||
|
|
||||
LL | impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {}
|
||||
| ^ unconstrained type parameter
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0107, E0207.
|
||||
For more information about an error, try `rustc --explain E0107`.
|
||||
|
Loading…
Reference in New Issue
Block a user