@@ -431,18 +431,20 @@ pub fn super_relate_tys<R: TypeRelation<'tcx>>(
431431 let t = relation. relate ( & a_t, & b_t) ?;
432432 match relation. relate ( & sz_a, & sz_b) {
433433 Ok ( sz) => Ok ( tcx. mk_ty ( ty:: Array ( t, sz) ) ) ,
434+ // FIXME(lazy_normalization_consts) Implement improved diagnostics for mismatched array
435+ // length?
436+ Err ( err) if relation. tcx ( ) . features ( ) . lazy_normalization_consts => Err ( err) ,
434437 Err ( err) => {
435- // // Check whether the lengths are both concrete/known values,
436- // // but are unequal, for better diagnostics.
437- // let sz_a = sz_a.try_eval_usize(tcx, relation.param_env());
438- // let sz_b = sz_b.try_eval_usize(tcx, relation.param_env());
439- // match (sz_a, sz_b) {
440- // (Some(sz_a_val), Some(sz_b_val)) => Err(TypeError::FixedArraySize(
441- // expected_found(relation, &sz_a_val, &sz_b_val),
442- // )),
443- // _ => Err(err),
444- // }
445- Err ( err)
438+ // Check whether the lengths are both concrete/known values,
439+ // but are unequal, for better diagnostics.
440+ let sz_a = sz_a. try_eval_usize ( tcx, relation. param_env ( ) ) ;
441+ let sz_b = sz_b. try_eval_usize ( tcx, relation. param_env ( ) ) ;
442+ match ( sz_a, sz_b) {
443+ ( Some ( sz_a_val) , Some ( sz_b_val) ) => Err ( TypeError :: FixedArraySize (
444+ expected_found ( relation, & sz_a_val, & sz_b_val) ,
445+ ) ) ,
446+ _ => Err ( err) ,
447+ }
446448 }
447449 }
448450 }
@@ -605,14 +607,14 @@ pub fn super_relate_consts<R: TypeRelation<'tcx>>(
605607 }
606608
607609 // FIXME(const_generics): this is wrong, as it is a projection
608- // (
609- // ty::ConstKind::Unevaluated(a_def_id, a_substs, a_promoted),
610- // ty::ConstKind::Unevaluated(b_def_id, b_substs, b_promoted),
611- // ) if a_def_id == b_def_id && a_promoted == b_promoted => {
612- // let substs =
613- // relation.relate_with_variance(ty::Variance::Invariant, &a_substs, &b_substs)?;
614- // Ok(ty::ConstKind::Unevaluated(a_def_id, &substs, a_promoted))
615- // }
610+ (
611+ ty:: ConstKind :: Unevaluated ( a_def_id, a_substs, a_promoted) ,
612+ ty:: ConstKind :: Unevaluated ( b_def_id, b_substs, b_promoted) ,
613+ ) if a_def_id == b_def_id && a_promoted == b_promoted => {
614+ let substs =
615+ relation. relate_with_variance ( ty:: Variance :: Invariant , & a_substs, & b_substs) ?;
616+ Ok ( ty:: ConstKind :: Unevaluated ( a_def_id, & substs, a_promoted) )
617+ }
616618 _ => Err ( TypeError :: ConstMismatch ( expected_found ( relation, & a, & b) ) ) ,
617619 } ;
618620 new_const_val. map ( |val| tcx. mk_const ( ty:: Const { val, ty : a. ty } ) )
0 commit comments