Change:
thread panicked at 'called on a value', <details<summaryBacktrace</summary</detailsRegression in nightly-2022-12-04, in rollup , likely from (

Discussion:
infer::LateBoundRegionConversionTime::HigherRankedType, bound_predicate.rebind(data), ); <del> let normalized_ty = ocx.normalize( &obligation.cause, obligation.param_env, self.tcx.mk_projection(data.projection_ty.def_id, data.projection_ty.substs), ); </del> <ins> let unnormalized_term = match data.term.unpack() { ty::TermKind::Ty(_) => self .tcx .mk_projection(data.projection_ty.def_id, data.projection_ty.substs) .into(), ty::TermKind::Const(ct) => self .tcx .mk_const( ty::UnevaluatedConst { def: ty::WithOptConstParam::unknown(data.projection_ty.def_id), substs: data.projection_ty.substs, }, ct.ty(), ) .into(), }; let normalized_term = ocx.normalize(&obligation.cause, obligation.param_env, unnormalized_term); </ins> debug!(?obligation.cause, ?obligation.param_env); <del> debug!(?normalized_ty, data.ty = ?data.term); </del> <ins> debug!(?normalized_term, data.ty = ?data.term); </ins> <del> let is_normalized_ty_expected = !matches!( </del> <ins> let is_normalized_term_expected = !matches!( </ins> obligation.cause.code().peel_derives(), ObligationCauseCode::ItemObligation(_) | ObligationCauseCode::BindingObligation(_, _)

| ObligationCauseCode::ObjectCastObligation(..) | ObligationCauseCode::OpaqueType ); <del> let expected_ty = data.term.ty().unwrap_or_else(|| self.tcx.ty_error()); </del> // constrain inference variables a bit more to nested obligations from normalize so // we can have more helpful errors.

if let Err(new_err) = ocx.eq_exp( &obligation.cause, obligation.param_env, <del> is_normalized_ty_expected, normalized_ty, expected_ty, </del> <ins> is_normalized_term_expected, normalized_term, data.term, </ins> ) { <del> (Some((data, is_normalized_ty_expected, normalized_ty, expected_ty)), new_err) </del> <ins> (Some((data, is_normalized_term_expected, normalized_term, data.term)), new_err) </ins> } else { (None, error.err) }

}; let msg = values <del> .and_then(|(predicate, _, normalized_ty, expected_ty)| { self.maybe_detailed_projection_msg( predicate, normalized_ty.into(), expected_ty.into(), ) </del> <ins> .and_then(|(predicate, _, normalized_term, expected_term)| { self.maybe_detailed_projection_msg(predicate, normalized_term, expected_term) </ins> }) .unwrap_or_else(|| format!("type mismatch resolving `{}`", predicate)); let mut diag = struct_span_err!(self.tcx.sess, obligation.cause.span, E0271, "{msg}");

<ins> warning: the feature `generic_const_exprs` is incomplete and may not be safe to use and/or cause compiler crashes --> $DIR/const-projection-err.rs:4:26 | LL | #![cfg_attr(gce, feature(generic_const_exprs))] |                          ^^^^^^^^^^^^^^^^^^^ | = note: see issue #76560 <https://github.com/rust-lang/rust/issues/76560> for more information = note: `#[warn(incomplete_features)]` on by default error[E0271]: type mismatch resolving `<T as TraitWAssocConst>::A == 1` --> $DIR/const-projection-err.rs:14:11 | LL |     foo::<T>(); |           ^ expected `0`, found `1` | note: required by a bound in `foo` --> $DIR/const-projection-err.rs:11:28 | LL | fn foo<T: TraitWAssocConst<A = 1>>() {} |                            ^^^^^ required by this bound in `foo` error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0271`. </ins>

<ins> // revisions: stock gce #![feature(associated_const_equality)] #![cfg_attr(gce, feature(generic_const_exprs))] //[gce]~^ WARN the feature `generic_const_exprs` is incomplete trait TraitWAssocConst { const A: usize; } fn foo<T: TraitWAssocConst<A = 1>>() {} fn bar<T: TraitWAssocConst<A = 0>>() { foo::<T>(); //~^ ERROR type mismatch resolving `<T as TraitWAssocConst>::A == 1` } fn main() {} </ins>

<ins> error[E0271]: type mismatch resolving `<T as TraitWAssocConst>::A == 1` --> $DIR/const-projection-err.rs:14:11 | LL |     foo::<T>(); |           ^ expected `1`, found `<T as TraitWAssocConst>::A` | = note: expected constant `1` found constant `<T as TraitWAssocConst>::A` note: required by a bound in `foo` --> $DIR/const-projection-err.rs:11:28 | LL | fn foo<T: TraitWAssocConst<A = 1>>() {} |                            ^^^^^ required by this bound in `foo` error: aborting due to previous error For more information about this error, try `rustc --explain E0271`. </ins>

--> $DIR/issue-105330.rs:12:11 | LL |     foo::<Demo>()(); <del> |           ^^^^ types differ </del> <ins> |           ^^^^ expected `32`, found `<Demo as TraitWAssocConst>::A` </ins> | <ins> = note: expected constant `32` found constant `<Demo as TraitWAssocConst>::A` </ins> note: required by a bound in `foo` --> $DIR/issue-105330.rs:11:28 |

--> $DIR/issue-105330.rs:19:11 | LL |     foo::<Demo>(); <del> |           ^^^^ types differ </del> <ins> |           ^^^^ expected `32`, found `<Demo as TraitWAssocConst>::A` </ins> | <ins> = note: expected constant `32` found constant `<Demo as TraitWAssocConst>::A` </ins> note: required by a bound in `foo` --> $DIR/issue-105330.rs:11:28 |