@@ -431,18 +431,20 @@ pub fn super_relate_tys<R: TypeRelation<'tcx>>(
431
431
let t = relation. relate ( & a_t, & b_t) ?;
432
432
match relation. relate ( & sz_a, & sz_b) {
433
433
Ok ( sz) => Ok ( tcx. mk_ty ( ty:: Array ( t, sz) ) ) ,
434
+ // FIXME(lazy-normalization) Implement improved diagnostics for mismatched array
435
+ // length?
436
+ Err ( err) if relation. tcx ( ) . sess . opts . debugging_opts . lazy_normalization => Err ( err) ,
434
437
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
+ }
446
448
}
447
449
}
448
450
}
@@ -568,14 +570,14 @@ pub fn super_relate_consts<R: TypeRelation<'tcx>>(
568
570
}
569
571
570
572
// FIXME(const_generics): this is wrong, as it is a projection
571
- // (
572
- // ty::ConstKind::Unevaluated(a_def_id, a_substs, a_promoted),
573
- // ty::ConstKind::Unevaluated(b_def_id, b_substs, b_promoted),
574
- // ) if a_def_id == b_def_id && a_promoted == b_promoted => {
575
- // let substs =
576
- // relation.relate_with_variance(ty::Variance::Invariant, &a_substs, &b_substs)?;
577
- // Ok(ty::ConstKind::Unevaluated(a_def_id, &substs, a_promoted))
578
- // }
573
+ (
574
+ ty:: ConstKind :: Unevaluated ( a_def_id, a_substs, a_promoted) ,
575
+ ty:: ConstKind :: Unevaluated ( b_def_id, b_substs, b_promoted) ,
576
+ ) if a_def_id == b_def_id && a_promoted == b_promoted => {
577
+ let substs =
578
+ relation. relate_with_variance ( ty:: Variance :: Invariant , & a_substs, & b_substs) ?;
579
+ Ok ( ty:: ConstKind :: Unevaluated ( a_def_id, & substs, a_promoted) )
580
+ }
579
581
_ => Err ( TypeError :: ConstMismatch ( expected_found ( relation, & a, & b) ) ) ,
580
582
} ;
581
583
new_const_val. map ( |val| tcx. mk_const ( ty:: Const { val, ty : a. ty } ) )
0 commit comments