@@ -247,6 +247,7 @@ fn trait_of_item(tcx: TyCtxt<'_>, def_id: DefId) -> Option<DefId> {
247
247
}
248
248
249
249
/// See `ParamEnv` struct definition for details.
250
+ #[ instrument( level = "debug" , skip( tcx) ) ]
250
251
fn param_env ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> ty:: ParamEnv < ' _ > {
251
252
// The param_env of an impl Trait type is its defining function's param_env
252
253
if let Some ( parent) = ty:: is_impl_trait_defn ( tcx, def_id) {
@@ -274,9 +275,20 @@ fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> {
274
275
predicates. extend ( environment) ;
275
276
}
276
277
278
+ // It's important that we include the default substs in unevaluated
279
+ // constants, since `Unevaluated` instances in predicates whose substs are None
280
+ // can lead to "duplicate" caller bounds candidates during trait selection,
281
+ // duplicate in the sense that both have their default substs, but the
282
+ // candidate that resulted from a superpredicate still uses `None` in its
283
+ // `substs_` field of `Unevaluated` to indicate that it has its default substs,
284
+ // whereas the other candidate has `substs_: Some(default_substs)`, see
285
+ // issue #89334
286
+ predicates = tcx. expose_default_const_substs ( predicates) ;
287
+
277
288
let unnormalized_env =
278
289
ty:: ParamEnv :: new ( tcx. intern_predicates ( & predicates) , traits:: Reveal :: UserFacing ) ;
279
290
291
+ debug ! ( "unnormalized_env caller bounds: {:?}" , unnormalized_env. caller_bounds( ) ) ;
280
292
let body_id = def_id
281
293
. as_local ( )
282
294
. map ( |def_id| tcx. hir ( ) . local_def_id_to_hir_id ( def_id) )
0 commit comments