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