@@ -247,6 +247,7 @@ fn trait_of_item(tcx: TyCtxt<'_>, def_id: DefId) -> Option<DefId> {
247247}
248248
249249/// See `ParamEnv` struct definition for details.
250+ #[ instrument( level = "debug" , skip( tcx) ) ]
250251fn param_env ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> ty:: ParamEnv < ' _ > {
251252 // The param_env of an impl Trait type is its defining function's param_env
252253 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<'_> {
274275 predicates. extend ( environment) ;
275276 }
276277
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+
277288 let unnormalized_env =
278289 ty:: ParamEnv :: new ( tcx. intern_predicates ( & predicates) , traits:: Reveal :: UserFacing ) ;
279290
291+ debug ! ( "unnormalized_env caller bounds: {:?}" , unnormalized_env. caller_bounds( ) ) ;
280292 let body_id = def_id
281293 . as_local ( )
282294 . map ( |def_id| tcx. hir ( ) . local_def_id_to_hir_id ( def_id) )
0 commit comments