diff --git a/compiler/rustc_infer/src/infer/at.rs b/compiler/rustc_infer/src/infer/at.rs index 248e7ef82e4..aa74a92ad1f 100644 --- a/compiler/rustc_infer/src/infer/at.rs +++ b/compiler/rustc_infer/src/infer/at.rs @@ -288,21 +288,13 @@ impl<'tcx> ToTrace<'tcx> for &'tcx Const<'tcx> { impl<'tcx> ToTrace<'tcx> for ty::Term<'tcx> { fn to_trace( - tcx: TyCtxt<'tcx>, + _: TyCtxt<'tcx>, cause: &ObligationCause<'tcx>, a_is_expected: bool, a: Self, b: Self, ) -> TypeTrace<'tcx> { - match (a, b) { - (ty::Term::Ty(a), ty::Term::Ty(b)) => { - ToTrace::to_trace(tcx, cause, a_is_expected, a, b) - } - (ty::Term::Const(a), ty::Term::Const(b)) => { - ToTrace::to_trace(tcx, cause, a_is_expected, a, b) - } - (_, _) => span_bug!(cause.span, "Unexpected type/const mismatch"), - } + TypeTrace { cause: cause.clone(), values: Terms(ExpectedFound::new(a_is_expected, a, b)) } } } diff --git a/compiler/rustc_infer/src/infer/error_reporting/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/mod.rs index 1eb8190bd7d..24a5f55d53c 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/mod.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/mod.rs @@ -2127,6 +2127,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { infer::Types(exp_found) => self.expected_found_str_ty(exp_found), infer::Regions(exp_found) => self.expected_found_str(exp_found), infer::Consts(exp_found) => self.expected_found_str(exp_found), + infer::Terms(exp_found) => self.expected_found_str(exp_found), infer::TraitRefs(exp_found) => { let pretty_exp_found = ty::error::ExpectedFound { expected: exp_found.expected.print_only_trait_path(), diff --git a/compiler/rustc_infer/src/infer/mod.rs b/compiler/rustc_infer/src/infer/mod.rs index 266eec08ceb..330c99f6073 100644 --- a/compiler/rustc_infer/src/infer/mod.rs +++ b/compiler/rustc_infer/src/infer/mod.rs @@ -371,6 +371,7 @@ pub enum ValuePairs<'tcx> { Types(ExpectedFound>), Regions(ExpectedFound>), Consts(ExpectedFound<&'tcx ty::Const<'tcx>>), + Terms(ExpectedFound>), TraitRefs(ExpectedFound>), PolyTraitRefs(ExpectedFound>), } diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs index d06e8496f59..f16601dd08e 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs @@ -1356,26 +1356,11 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> { normalized_ty, data.term, ) { - values = Some(match (normalized_ty, data.term) { - (ty::Term::Ty(normalized_ty), ty::Term::Ty(ty)) => { - infer::ValuePairs::Types(ExpectedFound::new( - is_normalized_ty_expected, - normalized_ty, - ty, - )) - } - (ty::Term::Const(normalized_ct), ty::Term::Const(ct)) => { - infer::ValuePairs::Consts(ExpectedFound::new( - is_normalized_ty_expected, - normalized_ct, - ct, - )) - } - (_, _) => span_bug!( - obligation.cause.span, - "found const or type where other expected" - ), - }); + values = Some(infer::ValuePairs::Terms(ExpectedFound::new( + is_normalized_ty_expected, + normalized_ty, + data.term, + ))); err_buf = error; err = &err_buf; } diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs index ec495bcd655..11cde60f075 100644 --- a/compiler/rustc_trait_selection/src/traits/project.rs +++ b/compiler/rustc_trait_selection/src/traits/project.rs @@ -22,6 +22,7 @@ use crate::traits::error_reporting::InferCtxtExt as _; use rustc_data_structures::sso::SsoHashSet; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_errors::ErrorReported; +use rustc_hir::def::DefKind; use rustc_hir::def_id::DefId; use rustc_hir::lang_items::LangItem; use rustc_infer::infer::resolve::OpportunisticRegionResolver; @@ -200,7 +201,7 @@ fn project_and_unify_type<'cx, 'tcx>( let infcx = selcx.infcx(); match obligation.predicate.term { ty::Term::Ty(obligation_pred_ty) => { - let normalized_ty = match opt_normalize_projection_type::( + let normalized_ty = match opt_normalize_projection_type( selcx, obligation.param_env, obligation.predicate.projection_ty, @@ -215,7 +216,7 @@ fn project_and_unify_type<'cx, 'tcx>( debug!(?normalized_ty, ?obligations, "project_and_unify_type result"); match infcx .at(&obligation.cause, obligation.param_env) - .eq(normalized_ty, obligation_pred_ty.into()) + .eq(normalized_ty, obligation_pred_ty) { Ok(InferOk { obligations: inferred_obligations, value: () }) => { obligations.extend(inferred_obligations); @@ -228,7 +229,7 @@ fn project_and_unify_type<'cx, 'tcx>( } } ty::Term::Const(obligation_pred_const) => { - let normalized_const = match opt_normalize_projection_type::( + let normalized_const = match opt_normalize_projection_type( selcx, obligation.param_env, obligation.predicate.projection_ty, @@ -492,7 +493,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> { let (data, mapped_regions, mapped_types, mapped_consts) = BoundVarReplacer::replace_bound_vars(infcx, &mut self.universes, data); let data = data.super_fold_with(self); - let normalized_ty = opt_normalize_projection_type::( + let normalized_ty = opt_normalize_projection_type( self.selcx, self.param_env, data, @@ -826,7 +827,7 @@ pub fn normalize_projection_type<'a, 'b, 'tcx>( depth: usize, obligations: &mut Vec>, ) -> Term<'tcx> { - opt_normalize_projection_type::( + opt_normalize_projection_type( selcx, param_env, projection_ty, @@ -859,7 +860,7 @@ pub fn normalize_projection_type<'a, 'b, 'tcx>( /// function takes an obligations vector and appends to it directly, which is /// slightly uglier but avoids the need for an extra short-lived allocation. #[instrument(level = "debug", skip(selcx, param_env, cause, obligations))] -fn opt_normalize_projection_type<'a, 'b, 'tcx, const INTO_CONST: bool>( +fn opt_normalize_projection_type<'a, 'b, 'tcx>( selcx: &'a mut SelectionContext<'b, 'tcx>, param_env: ty::ParamEnv<'tcx>, projection_ty: ty::ProjectionTy<'tcx>, @@ -946,7 +947,7 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx, const INTO_CONST: bool>( let obligation = Obligation::with_depth(cause.clone(), depth, param_env, projection_ty); - match project::(selcx, &obligation) { + match project(selcx, &obligation) { Ok(Projected::Progress(Progress { term: projected_term, obligations: mut projected_obligations, @@ -1087,7 +1088,7 @@ impl<'tcx> Progress<'tcx> { /// IMPORTANT: /// - `obligation` must be fully normalized #[tracing::instrument(level = "info", skip(selcx))] -fn project<'cx, 'tcx, const INTO_CONST: bool>( +fn project<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, ) -> Result, ProjectionError<'tcx>> { @@ -1123,7 +1124,7 @@ fn project<'cx, 'tcx, const INTO_CONST: bool>( match candidates { ProjectionCandidateSet::Single(candidate) => { - Ok(Projected::Progress(confirm_candidate::(selcx, obligation, candidate))) + Ok(Projected::Progress(confirm_candidate(selcx, obligation, candidate))) } ProjectionCandidateSet::None => Ok(Projected::NoProgress( selcx @@ -1525,7 +1526,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>( }); } -fn confirm_candidate<'cx, 'tcx, const INTO_CONST: bool>( +fn confirm_candidate<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, candidate: ProjectionCandidate<'tcx>, @@ -1542,7 +1543,7 @@ fn confirm_candidate<'cx, 'tcx, const INTO_CONST: bool>( } ProjectionCandidate::Select(impl_source) => { - confirm_select_candidate::(selcx, obligation, impl_source) + confirm_select_candidate(selcx, obligation, impl_source) } }; @@ -1558,15 +1559,13 @@ fn confirm_candidate<'cx, 'tcx, const INTO_CONST: bool>( progress } -fn confirm_select_candidate<'cx, 'tcx, const INTO_CONST: bool>( +fn confirm_select_candidate<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, impl_source: Selection<'tcx>, ) -> Progress<'tcx> { match impl_source { - super::ImplSource::UserDefined(data) => { - confirm_impl_candidate::(selcx, obligation, data) - } + super::ImplSource::UserDefined(data) => confirm_impl_candidate(selcx, obligation, data), super::ImplSource::Generator(data) => confirm_generator_candidate(selcx, obligation, data), super::ImplSource::Closure(data) => confirm_closure_candidate(selcx, obligation, data), super::ImplSource::FnPointer(data) => confirm_fn_pointer_candidate(selcx, obligation, data), @@ -1836,7 +1835,7 @@ fn confirm_param_env_candidate<'cx, 'tcx>( } } -fn confirm_impl_candidate<'cx, 'tcx, const INTO_CONST: bool>( +fn confirm_impl_candidate<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, impl_impl_source: ImplSourceUserDefinedData<'tcx, PredicateObligation<'tcx>>, @@ -1874,10 +1873,12 @@ fn confirm_impl_candidate<'cx, 'tcx, const INTO_CONST: bool>( let substs = translate_substs(selcx.infcx(), param_env, impl_def_id, substs, assoc_ty.defining_node); let ty = tcx.type_of(assoc_ty.item.def_id); - let term: ty::Term<'tcx> = if INTO_CONST { - // FIXME(associated_const_equality): what are the right substs? + let is_const = matches!(tcx.def_kind(assoc_ty.item.def_id), DefKind::AssocConst); + let term: ty::Term<'tcx> = if is_const { + let identity_substs = + crate::traits::InternalSubsts::identity_for_item(tcx, assoc_ty.item.def_id); let did = ty::WithOptConstParam::unknown(assoc_ty.item.def_id); - let val = ty::ConstKind::Unevaluated(ty::Unevaluated::new(did, substs)); + let val = ty::ConstKind::Unevaluated(ty::Unevaluated::new(did, identity_substs)); tcx.mk_const(ty::Const { ty, val }).into() } else { ty.into() diff --git a/compiler/rustc_typeck/src/astconv/mod.rs b/compiler/rustc_typeck/src/astconv/mod.rs index 6124d2906ff..06d472214e4 100644 --- a/compiler/rustc_typeck/src/astconv/mod.rs +++ b/compiler/rustc_typeck/src/astconv/mod.rs @@ -1244,6 +1244,20 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { // the "projection predicate" for: // // `::Item = u32` + let def_kind = tcx.def_kind(projection_ty.skip_binder().item_def_id); + match (def_kind, term) { + (hir::def::DefKind::AssocTy, ty::Term::Ty(_)) + | (hir::def::DefKind::AssocConst, ty::Term::Const(_)) => (), + (_, _) => { + tcx.sess + .struct_span_err( + binding.span, + "type/const mismatch in equality bind of associated field", + ) + .span_label(binding.span, "type/const Mismatch") + .emit(); + } + } bounds.projection_bounds.push(( projection_ty.map_bound(|projection_ty| ty::ProjectionPredicate { projection_ty, diff --git a/src/test/ui/associated-consts/assoc-const-ty-mismatch.rs b/src/test/ui/associated-consts/assoc-const-ty-mismatch.rs index 53e49e77b3e..c48f4c63b02 100644 --- a/src/test/ui/associated-consts/assoc-const-ty-mismatch.rs +++ b/src/test/ui/associated-consts/assoc-const-ty-mismatch.rs @@ -21,7 +21,9 @@ impl FooTy for Bar { fn foo>() {} +//~^ ERROR type/const mismatch fn foo2>() {} +//~^ ERROR type/const mismatch fn main() { foo::(); diff --git a/src/test/ui/associated-consts/assoc-const-ty-mismatch.stderr b/src/test/ui/associated-consts/assoc-const-ty-mismatch.stderr new file mode 100644 index 00000000000..71f8375d4e6 --- /dev/null +++ b/src/test/ui/associated-consts/assoc-const-ty-mismatch.stderr @@ -0,0 +1,14 @@ +error: type/const mismatch in equality bind of associated field + --> $DIR/assoc-const-ty-mismatch.rs:23:15 + | +LL | fn foo>() {} + | ^^^^^^^ type/const Mismatch + +error: type/const mismatch in equality bind of associated field + --> $DIR/assoc-const-ty-mismatch.rs:25:18 + | +LL | fn foo2>() {} + | ^^^^^^^^ type/const Mismatch + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/associated-types/associated-types-binding-to-type-defined-in-supertrait.stderr b/src/test/ui/associated-types/associated-types-binding-to-type-defined-in-supertrait.stderr index 0cccc6b38a3..c14fd7c9ee8 100644 --- a/src/test/ui/associated-types/associated-types-binding-to-type-defined-in-supertrait.stderr +++ b/src/test/ui/associated-types/associated-types-binding-to-type-defined-in-supertrait.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `::Color == Blue` LL | fn b() { blue_car(ModelT); } | ^^^^^^^^ type mismatch resolving `::Color == Blue` | -note: expected this to be `Blue` +note: expected struct `Blue`, found struct `Black` --> $DIR/associated-types-binding-to-type-defined-in-supertrait.rs:16:40 | LL | impl Vehicle for ModelT { type Color = Black; } @@ -21,7 +21,7 @@ error[E0271]: type mismatch resolving `::Color == Black` LL | fn c() { black_car(ModelU); } | ^^^^^^^^^ type mismatch resolving `::Color == Black` | -note: expected this to be `Black` +note: expected struct `Black`, found struct `Blue` --> $DIR/associated-types-binding-to-type-defined-in-supertrait.rs:21:40 | LL | impl Vehicle for ModelU { type Color = Blue; } diff --git a/src/test/ui/associated-types/associated-types-eq-3.stderr b/src/test/ui/associated-types/associated-types-eq-3.stderr index 521907a6044..64f7a575cd5 100644 --- a/src/test/ui/associated-types/associated-types-eq-3.stderr +++ b/src/test/ui/associated-types/associated-types-eq-3.stderr @@ -19,7 +19,7 @@ error[E0271]: type mismatch resolving `::A == Bar` LL | foo1(a); | ^^^^ type mismatch resolving `::A == Bar` | -note: expected this to be `Bar` +note: expected struct `Bar`, found `usize` --> $DIR/associated-types-eq-3.rs:12:14 | LL | type A = usize; @@ -36,7 +36,7 @@ error[E0271]: type mismatch resolving `::A == Bar` LL | baz(&a); | ^^ type mismatch resolving `::A == Bar` | -note: expected this to be `Bar` +note: expected struct `Bar`, found `usize` --> $DIR/associated-types-eq-3.rs:12:14 | LL | type A = usize; diff --git a/src/test/ui/associated-types/associated-types-eq-hr.stderr b/src/test/ui/associated-types/associated-types-eq-hr.stderr index 1329e1382fd..cc69c92b930 100644 --- a/src/test/ui/associated-types/associated-types-eq-hr.stderr +++ b/src/test/ui/associated-types/associated-types-eq-hr.stderr @@ -4,13 +4,11 @@ error[E0271]: type mismatch resolving `for<'x> (); | ^^^^^^^^^^^^^^^^^ type mismatch resolving `for<'x> >::A == &'x isize` | -note: expected this to be `&isize` +note: expected `isize`, found `usize` --> $DIR/associated-types-eq-hr.rs:26:14 | LL | type A = &'a usize; | ^^^^^^^^^ - = note: expected reference `&isize` - found reference `&usize` note: required by a bound in `foo` --> $DIR/associated-types-eq-hr.rs:45:36 | @@ -26,13 +24,11 @@ error[E0271]: type mismatch resolving `for<'x> LL | bar::(); | ^^^^^^^^^^^^^^^^ type mismatch resolving `for<'x> >::A == &'x usize` | -note: expected this to be `&usize` +note: expected `usize`, found `isize` --> $DIR/associated-types-eq-hr.rs:14:14 | LL | type A = &'a isize; | ^^^^^^^^^ - = note: expected reference `&usize` - found reference `&isize` note: required by a bound in `bar` --> $DIR/associated-types-eq-hr.rs:52:36 | diff --git a/src/test/ui/associated-types/associated-types-issue-20346.stderr b/src/test/ui/associated-types/associated-types-issue-20346.stderr index 516057e53d2..4e4b8be462b 100644 --- a/src/test/ui/associated-types/associated-types-issue-20346.stderr +++ b/src/test/ui/associated-types/associated-types-issue-20346.stderr @@ -7,12 +7,12 @@ LL | fn test_adapter>>(it: I) { LL | is_iterator_of::, _>(&adapter); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving ` as Iterator>::Item == Option` | -note: expected this to be `Option` +note: expected enum `Option`, found type parameter `T` --> $DIR/associated-types-issue-20346.rs:23:17 | LL | type Item = T; | ^ - = note: expected enum `Option` + = note: expected type `Option` found type `T` note: required by a bound in `is_iterator_of` --> $DIR/associated-types-issue-20346.rs:15:34 diff --git a/src/test/ui/associated-types/associated-types-multiple-types-one-trait.stderr b/src/test/ui/associated-types/associated-types-multiple-types-one-trait.stderr index 922cf88a049..eba9483ff22 100644 --- a/src/test/ui/associated-types/associated-types-multiple-types-one-trait.stderr +++ b/src/test/ui/associated-types/associated-types-multiple-types-one-trait.stderr @@ -4,8 +4,8 @@ error[E0271]: type mismatch resolving `::Y == i32` LL | want_y(t); | ^^^^^^ expected `i32`, found associated type | - = note: expected type `i32` - found associated type `::Y` + = note: expected type `i32` + found type `::Y` note: required by a bound in `want_y` --> $DIR/associated-types-multiple-types-one-trait.rs:44:17 | @@ -22,8 +22,8 @@ error[E0271]: type mismatch resolving `::X == u32` LL | want_x(t); | ^^^^^^ expected `u32`, found associated type | - = note: expected type `u32` - found associated type `::X` + = note: expected type `u32` + found type `::X` note: required by a bound in `want_x` --> $DIR/associated-types-multiple-types-one-trait.rs:42:17 | diff --git a/src/test/ui/associated-types/hr-associated-type-projection-1.stderr b/src/test/ui/associated-types/hr-associated-type-projection-1.stderr index 9c29e969de8..6c1881fcd29 100644 --- a/src/test/ui/associated-types/hr-associated-type-projection-1.stderr +++ b/src/test/ui/associated-types/hr-associated-type-projection-1.stderr @@ -4,8 +4,8 @@ error[E0271]: type mismatch resolving `::Target == T` LL | impl UnsafeCopy<'_, T> for T { | - this type parameter ^^^^^^^^^^^^^^^^^ expected associated type, found type parameter `T` | - = note: expected associated type `::Target` - found type parameter `T` + = note: expected type `::Target` + found type `T` help: consider further restricting this bound | LL | impl> UnsafeCopy<'_, T> for T { diff --git a/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr b/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr index 283ecea735d..28ef77ae137 100644 --- a/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr +++ b/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr @@ -1,14 +1,11 @@ error[E0271]: type mismatch resolving `::Item == i32` --> $DIR/impl-trait-return-missing-constraint.rs:25:13 | -LL | fn bar() -> impl Bar { - | -------- the found opaque type -... LL | fn baz() -> impl Bar { | ^^^^^^^^^^^^^^^^^^^^ expected `i32`, found associated type | - = note: expected type `i32` - found associated type `::Item` + = note: expected type `i32` + found type `::Item` help: consider constraining the associated type `::Item` to `i32` | LL | fn bar() -> impl Bar { diff --git a/src/test/ui/associated-types/issue-44153.stderr b/src/test/ui/associated-types/issue-44153.stderr index 200efbe02e6..9244b4821f3 100644 --- a/src/test/ui/associated-types/issue-44153.stderr +++ b/src/test/ui/associated-types/issue-44153.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `<() as Array>::Element == &()` LL | <() as Visit>::visit(); | ^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `<() as Array>::Element == &()` | -note: expected this to be `&()` +note: expected `&()`, found `()` --> $DIR/issue-44153.rs:10:20 | LL | type Element = (); diff --git a/src/test/ui/associated-types/issue-72806.stderr b/src/test/ui/associated-types/issue-72806.stderr index e95943f34d5..67b1295d0fe 100644 --- a/src/test/ui/associated-types/issue-72806.stderr +++ b/src/test/ui/associated-types/issue-72806.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `::Ok == char` LL | type Sibling = Foo2; | ^^^^ type mismatch resolving `::Ok == char` | -note: expected this to be `char` +note: expected `char`, found `u32` --> $DIR/issue-72806.rs:18:15 | LL | type Ok = u32; diff --git a/src/test/ui/associated-types/issue-87261.stderr b/src/test/ui/associated-types/issue-87261.stderr index c00b48abc1c..e387d34266e 100644 --- a/src/test/ui/associated-types/issue-87261.stderr +++ b/src/test/ui/associated-types/issue-87261.stderr @@ -4,8 +4,8 @@ error[E0271]: type mismatch resolving `::Associated == ()` LL | accepts_trait(a); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` note: required by a bound in `accepts_trait` --> $DIR/issue-87261.rs:43:27 | @@ -22,8 +22,8 @@ error[E0271]: type mismatch resolving `::Associated == ()` LL | accepts_trait(b); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` = help: consider constraining the associated type `::Associated` to `()` = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html note: required by a bound in `accepts_trait` @@ -38,8 +38,8 @@ error[E0271]: type mismatch resolving `::Associated == ()` LL | accepts_trait(c); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` note: required by a bound in `accepts_trait` --> $DIR/issue-87261.rs:43:27 | @@ -56,8 +56,8 @@ error[E0271]: type mismatch resolving `::Associated == ()` LL | accepts_trait(d); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` = help: consider constraining the associated type `::Associated` to `()` = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html note: required by a bound in `accepts_trait` @@ -72,8 +72,8 @@ error[E0271]: type mismatch resolving `>::Associated == () LL | accepts_generic_trait(e); | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `>::Associated` + = note: expected type `()` + found type `>::Associated` note: required by a bound in `accepts_generic_trait` --> $DIR/issue-87261.rs:44:46 | @@ -90,8 +90,8 @@ error[E0271]: type mismatch resolving `>::Associated == () LL | accepts_generic_trait(f); | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `>::Associated` + = note: expected type `()` + found type `>::Associated` note: required by a bound in `accepts_generic_trait` --> $DIR/issue-87261.rs:44:46 | @@ -108,8 +108,8 @@ error[E0271]: type mismatch resolving `>::Associated == () LL | accepts_generic_trait(g); | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `>::Associated` + = note: expected type `()` + found type `>::Associated` = help: consider constraining the associated type `>::Associated` to `()` = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html note: required by a bound in `accepts_generic_trait` @@ -121,14 +121,11 @@ LL | fn accepts_generic_trait>(_: T) {} error[E0271]: type mismatch resolving `::Associated == ()` --> $DIR/issue-87261.rs:79:5 | -LL | fn returns_opaque() -> impl Trait + 'static { - | -------------------- the found opaque type -... LL | accepts_trait(returns_opaque()); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` note: required by a bound in `accepts_trait` --> $DIR/issue-87261.rs:43:27 | @@ -142,14 +139,11 @@ LL | fn returns_opaque() -> impl Trait + 'static { error[E0271]: type mismatch resolving `::Associated == ()` --> $DIR/issue-87261.rs:82:5 | -LL | fn returns_opaque_derived() -> impl DerivedTrait + 'static { - | --------------------------- the found opaque type -... LL | accepts_trait(returns_opaque_derived()); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` note: required by a bound in `accepts_trait` --> $DIR/issue-87261.rs:43:27 | @@ -163,14 +157,11 @@ LL | fn returns_opaque_derived() -> impl DerivedTrait + 'static error[E0271]: type mismatch resolving `::Associated == ()` --> $DIR/issue-87261.rs:85:5 | -LL | fn returns_opaque_foo() -> impl Trait + Foo { - | ---------------- the found opaque type -... LL | accepts_trait(returns_opaque_foo()); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` note: required by a bound in `accepts_trait` --> $DIR/issue-87261.rs:43:27 | @@ -184,14 +175,11 @@ LL | fn returns_opaque_foo() -> impl Trait + Foo { error[E0271]: type mismatch resolving `::Associated == ()` --> $DIR/issue-87261.rs:88:5 | -LL | fn returns_opaque_derived_foo() -> impl DerivedTrait + Foo { - | ----------------------- the found opaque type -... LL | accepts_trait(returns_opaque_derived_foo()); | ^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type `::Associated` + = note: expected type `()` + found type `::Associated` = help: consider constraining the associated type `::Associated` to `()` = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html note: required by a bound in `accepts_trait` @@ -203,14 +191,11 @@ LL | fn accepts_trait>(_: T) {} error[E0271]: type mismatch resolving ` as GenericTrait<()>>::Associated == ()` --> $DIR/issue-87261.rs:91:5 | -LL | fn returns_opaque_generic() -> impl GenericTrait<()> + 'static { - | ------------------------------- the found opaque type -... LL | accepts_generic_trait(returns_opaque_generic()); | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type ` as GenericTrait<()>>::Associated` + = note: expected type `()` + found type ` as GenericTrait<()>>::Associated` note: required by a bound in `accepts_generic_trait` --> $DIR/issue-87261.rs:44:46 | @@ -224,14 +209,11 @@ LL | fn returns_opaque_generic() -> impl GenericTrait<(), Associated = ()> + 'st error[E0271]: type mismatch resolving ` as GenericTrait<()>>::Associated == ()` --> $DIR/issue-87261.rs:94:5 | -LL | fn returns_opaque_generic_foo() -> impl GenericTrait<()> + Foo { - | --------------------------- the found opaque type -... LL | accepts_generic_trait(returns_opaque_generic_foo()); | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type ` as GenericTrait<()>>::Associated` + = note: expected type `()` + found type ` as GenericTrait<()>>::Associated` note: required by a bound in `accepts_generic_trait` --> $DIR/issue-87261.rs:44:46 | @@ -245,14 +227,11 @@ LL | fn returns_opaque_generic_foo() -> impl GenericTrait<(), Associated = ()> + error[E0271]: type mismatch resolving ` + GenericTrait<()> as GenericTrait<()>>::Associated == ()` --> $DIR/issue-87261.rs:97:5 | -LL | fn returns_opaque_generic_duplicate() -> impl GenericTrait<()> + GenericTrait { - | ---------------------------------------- the found opaque type -... LL | accepts_generic_trait(returns_opaque_generic_duplicate()); | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type | - = note: expected unit type `()` - found associated type ` + GenericTrait<()> as GenericTrait<()>>::Associated` + = note: expected type `()` + found type ` + GenericTrait<()> as GenericTrait<()>>::Associated` = help: consider constraining the associated type ` + GenericTrait<()> as GenericTrait<()>>::Associated` to `()` = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html note: required by a bound in `accepts_generic_trait` diff --git a/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr b/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr index 9afbe82c321..9fd474edff9 100644 --- a/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr +++ b/src/test/ui/associated-types/point-at-type-on-obligation-failure.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `::Ok == ()` LL | type Sibling = Foo2; | ^^^^ type mismatch resolving `::Ok == ()` | -note: expected this to be `()` +note: expected `()`, found `u32` --> $DIR/point-at-type-on-obligation-failure.rs:18:15 | LL | type Ok = u32; diff --git a/src/test/ui/error-codes/E0271.stderr b/src/test/ui/error-codes/E0271.stderr index 9c9c7237d71..ba5632f47a7 100644 --- a/src/test/ui/error-codes/E0271.stderr +++ b/src/test/ui/error-codes/E0271.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `::AssociatedType == u32` LL | foo(3_i8); | ^^^ type mismatch resolving `::AssociatedType == u32` | -note: expected this to be `u32` +note: expected `u32`, found `&str` --> $DIR/E0271.rs:7:43 | LL | impl Trait for i8 { type AssociatedType = &'static str; } diff --git a/src/test/ui/feature-gates/feature-gate-associated_const_equality.rs b/src/test/ui/feature-gates/feature-gate-associated_const_equality.rs index b51ead2a188..2534c527be4 100644 --- a/src/test/ui/feature-gates/feature-gate-associated_const_equality.rs +++ b/src/test/ui/feature-gates/feature-gate-associated_const_equality.rs @@ -9,7 +9,6 @@ impl TraitWAssocConst for Demo { fn foo>() {} //~^ ERROR associated const equality -//~| ERROR associated const equality fn main() { foo::(); diff --git a/src/test/ui/feature-gates/feature-gate-associated_const_equality.stderr b/src/test/ui/feature-gates/feature-gate-associated_const_equality.stderr index f4db49c4af8..6563fbcba2e 100644 --- a/src/test/ui/feature-gates/feature-gate-associated_const_equality.stderr +++ b/src/test/ui/feature-gates/feature-gate-associated_const_equality.stderr @@ -7,12 +7,6 @@ LL | fn foo>() {} = note: see issue #92827 for more information = help: add `#![feature(associated_const_equality)]` to the crate attributes to enable -error: associated const equality is incomplete - --> $DIR/feature-gate-associated_const_equality.rs:10:28 - | -LL | fn foo>() {} - | ^^^^ cannot yet relate associated const - -error: aborting due to 2 previous errors +error: aborting due to previous error For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/generator/type-mismatch-signature-deduction.stderr b/src/test/ui/generator/type-mismatch-signature-deduction.stderr index 3f1f33a3b12..3b447a17d52 100644 --- a/src/test/ui/generator/type-mismatch-signature-deduction.stderr +++ b/src/test/ui/generator/type-mismatch-signature-deduction.stderr @@ -19,7 +19,7 @@ LL | fn foo() -> impl Generator { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found enum `Result` | = note: expected type `i32` - found enum `Result<{integer}, _>` + found type `Result<{integer}, _>` error: aborting due to 2 previous errors diff --git a/src/test/ui/generic-associated-types/issue-68656-unsized-values.stderr b/src/test/ui/generic-associated-types/issue-68656-unsized-values.stderr index 8e0f2371601..ee72c8f5d23 100644 --- a/src/test/ui/generic-associated-types/issue-68656-unsized-values.stderr +++ b/src/test/ui/generic-associated-types/issue-68656-unsized-values.stderr @@ -6,8 +6,8 @@ LL | impl UnsafeCopy for T { LL | type Item<'a> = T; | ^ expected type parameter `T`, found associated type | - = note: expected type parameter `T` - found associated type `::Target` + = note: expected type `T` + found type `::Target` note: required by a bound in `UnsafeCopy::Item` --> $DIR/issue-68656-unsized-values.rs:6:36 | diff --git a/src/test/ui/generic-associated-types/issue-74684-2.stderr b/src/test/ui/generic-associated-types/issue-74684-2.stderr index f0e03e73f0b..7ca54373392 100644 --- a/src/test/ui/generic-associated-types/issue-74684-2.stderr +++ b/src/test/ui/generic-associated-types/issue-74684-2.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `<{integer} as Fun>::F<'_> == [u8]` LL | bug(Box::new(x)); | ^^^ type mismatch resolving `<{integer} as Fun>::F<'_> == [u8]` | -note: expected this to be `[u8]` +note: expected slice `[u8]`, found `i32` --> $DIR/issue-74684-2.rs:10:18 | LL | type F<'a> = i32; diff --git a/src/test/ui/hrtb/issue-62203-hrtb-ice.stderr b/src/test/ui/hrtb/issue-62203-hrtb-ice.stderr index 0ebba37e4ec..7a788fbd856 100644 --- a/src/test/ui/hrtb/issue-62203-hrtb-ice.stderr +++ b/src/test/ui/hrtb/issue-62203-hrtb-ice.stderr @@ -4,13 +4,13 @@ error[E0271]: type mismatch resolving `for<'r> as T0<'r, (&'r u8,)>>::O == <_ as Ty<'r>>::V` | -note: expected this to be `<_ as Ty<'_>>::V` +note: expected associated type, found struct `Unit4` --> $DIR/issue-62203-hrtb-ice.rs:21:14 | LL | type O = T::Output; | ^^^^^^^^^ - = note: expected associated type `<_ as Ty<'_>>::V` - found struct `Unit4` + = note: expected type `<_ as Ty<'_>>::V` + found type `Unit4` = help: consider constraining the associated type `<_ as Ty<'_>>::V` to `Unit4` or calling a method that returns `<_ as Ty<'_>>::V` = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html note: required by a bound in `T1::m` diff --git a/src/test/ui/impl-trait/bound-normalization-fail.stderr b/src/test/ui/impl-trait/bound-normalization-fail.stderr index afa21c1a858..788c7419559 100644 --- a/src/test/ui/impl-trait/bound-normalization-fail.stderr +++ b/src/test/ui/impl-trait/bound-normalization-fail.stderr @@ -4,13 +4,13 @@ error[E0271]: type mismatch resolving ` as FooLike>::Output == () -> impl FooLike { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving ` as FooLike>::Output == ::Assoc` | -note: expected this to be `::Assoc` +note: expected associated type, found `()` --> $DIR/bound-normalization-fail.rs:14:19 | LL | type Output = T; | ^ - = note: expected associated type `::Assoc` - found unit type `()` + = note: expected type `::Assoc` + found type `()` help: consider constraining the associated type `::Assoc` to `()` | LL | fn foo_fail>() -> impl FooLike { @@ -28,13 +28,13 @@ error[E0271]: type mismatch resolving ` as FooLike>::Output == >() -> impl FooLike { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving ` as FooLike>::Output == >::Assoc` | -note: expected this to be `>::Assoc` +note: expected associated type, found `()` --> $DIR/bound-normalization-fail.rs:14:19 | LL | type Output = T; | ^ - = note: expected associated type `>::Assoc` - found unit type `()` + = note: expected type `>::Assoc` + found type `()` help: consider constraining the associated type `>::Assoc` to `()` | LL | fn foo2_fail<'a, T: Trait<'a, Assoc = ()>>() -> impl FooLike { diff --git a/src/test/ui/impl-trait/issues/issue-70877.stderr b/src/test/ui/impl-trait/issues/issue-70877.stderr index fe48e92da5e..c187ca6ada8 100644 --- a/src/test/ui/impl-trait/issues/issue-70877.stderr +++ b/src/test/ui/impl-trait/issues/issue-70877.stderr @@ -1,19 +1,16 @@ error[E0271]: type mismatch resolving `::Item == Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` --> $DIR/issue-70877.rs:7:12 | -LL | type FooRet = impl std::fmt::Debug; - | -------------------- the found opaque type -... LL | type Foo = impl Iterator; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `::Item == Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` | -note: expected this to be `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` +note: expected enum `Option`, found opaque type --> $DIR/issue-70877.rs:13:17 | LL | type Item = FooItem; | ^^^^^^^ - = note: expected struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` - found struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> impl Debug + 'static)>` + = note: expected type `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` + found type `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> impl Debug + 'static)>` error: aborting due to previous error diff --git a/src/test/ui/impl-trait/projection-mismatch-in-impl-where-clause.stderr b/src/test/ui/impl-trait/projection-mismatch-in-impl-where-clause.stderr index 65daabe419d..bf5a182803a 100644 --- a/src/test/ui/impl-trait/projection-mismatch-in-impl-where-clause.stderr +++ b/src/test/ui/impl-trait/projection-mismatch-in-impl-where-clause.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `<() as Super>::Assoc == ()` LL | fn test() -> impl Test { | ^^^^^^^^^ type mismatch resolving `<() as Super>::Assoc == ()` | -note: expected this to be `()` +note: expected `()`, found `u8` --> $DIR/projection-mismatch-in-impl-where-clause.rs:6:18 | LL | type Assoc = u8; diff --git a/src/test/ui/issues/issue-31173.stderr b/src/test/ui/issues/issue-31173.stderr index 982b6118ce6..6d77ab01e83 100644 --- a/src/test/ui/issues/issue-31173.stderr +++ b/src/test/ui/issues/issue-31173.stderr @@ -4,8 +4,8 @@ error[E0271]: type mismatch resolving `, [ LL | .cloned() | ^^^^^^ expected reference, found `u8` | - = note: expected reference `&_` - found type `u8` + = note: expected type `&_` + found type `u8` note: required by a bound in `cloned` --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | diff --git a/src/test/ui/issues/issue-33941.stderr b/src/test/ui/issues/issue-33941.stderr index c6650d60c21..5b86981ec78 100644 --- a/src/test/ui/issues/issue-33941.stderr +++ b/src/test/ui/issues/issue-33941.stderr @@ -4,8 +4,8 @@ error[E0271]: type mismatch resolving ` $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | @@ -18,8 +18,8 @@ error[E0271]: type mismatch resolving `>` = note: required because of the requirements on the impl of `IntoIterator` for `Cloned>` diff --git a/src/test/ui/issues/issue-39970.stderr b/src/test/ui/issues/issue-39970.stderr index 1f64a90bc1c..73fca41b0c0 100644 --- a/src/test/ui/issues/issue-39970.stderr +++ b/src/test/ui/issues/issue-39970.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `for<'a> <() as Array<'a>>::Element == ()` LL | <() as Visit>::visit(); | ^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `for<'a> <() as Array<'a>>::Element == ()` | -note: expected this to be `()` +note: expected `()`, found `&()` --> $DIR/issue-39970.rs:10:20 | LL | type Element = &'a (); diff --git a/src/test/ui/issues/issue-67039-unsound-pin-partialeq.stderr b/src/test/ui/issues/issue-67039-unsound-pin-partialeq.stderr index 733456a1a8b..1c7c311b5d2 100644 --- a/src/test/ui/issues/issue-67039-unsound-pin-partialeq.stderr +++ b/src/test/ui/issues/issue-67039-unsound-pin-partialeq.stderr @@ -4,8 +4,8 @@ error[E0271]: type mismatch resolving ` as Deref>::Target == Rc LL | let _ = Pin::new(Apple) == Rc::pin(Apple); | ^^ expected struct `Apple`, found struct `Rc` | - = note: expected struct `Apple` - found struct `Rc` + = note: expected type `Apple` + found type `Rc` = note: required because of the requirements on the impl of `PartialEq>>` for `Pin` error: aborting due to previous error diff --git a/src/test/ui/never_type/fallback-closure-wrap.fallback.stderr b/src/test/ui/never_type/fallback-closure-wrap.fallback.stderr index 78d1a3caf4a..24d45a30623 100644 --- a/src/test/ui/never_type/fallback-closure-wrap.fallback.stderr +++ b/src/test/ui/never_type/fallback-closure-wrap.fallback.stderr @@ -8,8 +8,8 @@ LL | | panic!("Can't connect to server."); LL | | }) as Box); | |______^ expected `()`, found `!` | - = note: expected unit type `()` - found type `!` + = note: expected type `()` + found type `!` = note: required for the cast to the object type `dyn FnMut()` error: aborting due to previous error diff --git a/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.stderr index 4251c1a1ed6..bf7691e7f1b 100644 --- a/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.stderr +++ b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `::T == i64` LL | is_obj(x) | ^^^^^^ type mismatch resolving `::T == i64` | -note: expected this to be `i64` +note: expected `i64`, found `i32` --> $DIR/check-trait-object-bounds-5.rs:9:14 | LL | type T = U; diff --git a/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.stderr index 5b23a513eea..016de72847d 100644 --- a/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.stderr +++ b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.stderr @@ -4,7 +4,7 @@ error[E0271]: type mismatch resolving `::T == i64` LL | is_obj(x) | ^^^^^^ type mismatch resolving `::T == i64` | -note: expected this to be `i64` +note: expected `i64`, found `i32` --> $DIR/check-trait-object-bounds-6.rs:9:14 | LL | type T = U; diff --git a/src/test/ui/type-alias-impl-trait/issue-63355.stderr b/src/test/ui/type-alias-impl-trait/issue-63355.stderr index 6fc6b4bfe1f..860a371b086 100644 --- a/src/test/ui/type-alias-impl-trait/issue-63355.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-63355.stderr @@ -1,18 +1,16 @@ error[E0271]: type mismatch resolving `<() as Bar>::Foo == ()` --> $DIR/issue-63355.rs:34:20 | -LL | pub type FooImpl = impl Foo; - | -------- the found opaque type LL | pub type BarImpl = impl Bar; | ^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `<() as Bar>::Foo == ()` | -note: expected this to be `()` +note: expected `()`, found opaque type --> $DIR/issue-63355.rs:24:16 | LL | type Foo = FooImpl; | ^^^^^^^ - = note: expected unit type `()` - found opaque type `impl Foo` + = note: expected type `()` + found type `impl Foo` error: aborting due to previous error diff --git a/src/test/ui/type-alias-impl-trait/issue-89686.stderr b/src/test/ui/type-alias-impl-trait/issue-89686.stderr index 19ed9a7476c..56e6a5420dd 100644 --- a/src/test/ui/type-alias-impl-trait/issue-89686.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-89686.stderr @@ -3,17 +3,9 @@ error[E0271]: type mismatch resolving ` as | LL | type G<'a, T> = impl Future; | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type -... -LL | async move { self.f().await } - | ------------------ the found `async` block | - ::: $SRC_DIR/core/src/future/mod.rs:LL:COL - | -LL | pub const fn from_generator(gen: T) -> impl Future - | ------------------------------- the found opaque type - | - = note: expected unit type `()` - found associated type ` as Future>::Output` + = note: expected type `()` + found type ` as Future>::Output` = help: consider constraining the associated type ` as Future>::Output` to `()` = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html