@@ -1970,7 +1970,8 @@ fn named_associated_type_shorthand_candidates<'db, R>(
1970
1970
let mut search = |t : TraitRef < ' db > | -> Option < R > {
1971
1971
let trait_id = t. def_id . 0 ;
1972
1972
let mut checked_traits = FxHashSet :: default ( ) ;
1973
- let mut check_trait = |trait_id : TraitId | {
1973
+ let mut check_trait = |trait_ref : TraitRef < ' db > | {
1974
+ let trait_id = trait_ref. def_id . 0 ;
1974
1975
let name = & db. trait_signature ( trait_id) . name ;
1975
1976
tracing:: debug!( ?trait_id, ?name) ;
1976
1977
if !checked_traits. insert ( trait_id) {
@@ -1981,37 +1982,39 @@ fn named_associated_type_shorthand_candidates<'db, R>(
1981
1982
tracing:: debug!( ?data. items) ;
1982
1983
for ( name, assoc_id) in & data. items {
1983
1984
if let & AssocItemId :: TypeAliasId ( alias) = assoc_id
1984
- && let Some ( ty) = check_alias ( name, t , alias)
1985
+ && let Some ( ty) = check_alias ( name, trait_ref , alias)
1985
1986
{
1986
1987
return Some ( ty) ;
1987
1988
}
1988
1989
}
1989
1990
None
1990
1991
} ;
1991
- let mut stack: SmallVec < [ _ ; 4 ] > = smallvec ! [ trait_id ] ;
1992
- while let Some ( trait_def_id ) = stack. pop ( ) {
1993
- if let Some ( alias) = check_trait ( trait_def_id ) {
1992
+ let mut stack: SmallVec < [ _ ; 4 ] > = smallvec ! [ t ] ;
1993
+ while let Some ( trait_ref ) = stack. pop ( ) {
1994
+ if let Some ( alias) = check_trait ( trait_ref ) {
1994
1995
return Some ( alias) ;
1995
1996
}
1996
1997
for pred in generic_predicates_filtered_by (
1997
1998
db,
1998
- GenericDefId :: TraitId ( trait_def_id ) ,
1999
+ GenericDefId :: TraitId ( trait_ref . def_id . 0 ) ,
1999
2000
PredicateFilter :: SelfTrait ,
2000
2001
// We are likely in the midst of lowering generic predicates of `def`.
2001
2002
// So, if we allow `pred == def` we might fall into an infinite recursion.
2002
2003
// Actually, we have already checked for the case `pred == def` above as we started
2003
2004
// with a stack including `trait_id`
2004
- |pred| pred != def && pred == GenericDefId :: TraitId ( trait_def_id ) ,
2005
+ |pred| pred != def && pred == GenericDefId :: TraitId ( trait_ref . def_id . 0 ) ,
2005
2006
)
2006
2007
. 0
2007
2008
. deref ( )
2008
2009
{
2009
2010
tracing:: debug!( ?pred) ;
2010
- let trait_id = match pred. kind ( ) . skip_binder ( ) {
2011
- rustc_type_ir:: ClauseKind :: Trait ( pred) => pred. def_id ( ) ,
2011
+ let sup_trait_ref = match pred. kind ( ) . skip_binder ( ) {
2012
+ rustc_type_ir:: ClauseKind :: Trait ( pred) => pred. trait_ref ,
2012
2013
_ => continue ,
2013
2014
} ;
2014
- stack. push ( trait_id. 0 ) ;
2015
+ let sup_trait_ref =
2016
+ EarlyBinder :: bind ( sup_trait_ref) . instantiate ( interner, trait_ref. args ) ;
2017
+ stack. push ( sup_trait_ref) ;
2015
2018
}
2016
2019
tracing:: debug!( ?stack) ;
2017
2020
}
0 commit comments