@@ -9,10 +9,10 @@ use derive_where::derive_where;
9
9
use rustc_type_ir:: inherent:: * ;
10
10
use rustc_type_ir:: lang_items:: TraitSolverLangItem ;
11
11
use rustc_type_ir:: {
12
- self as ty, Interner , TypeFoldable , TypeSuperVisitable , TypeVisitable , TypeVisitableExt as _ ,
13
- TypeVisitor , TypingMode , Upcast as _, elaborate,
12
+ self as ty, Interner , TypeFoldable , TypeFolder , TypeSuperFoldable , TypeSuperVisitable ,
13
+ TypeVisitable , TypeVisitableExt as _ , TypeVisitor , TypingMode , Upcast as _, elaborate,
14
14
} ;
15
- use tracing:: { debug , instrument} ;
15
+ use tracing:: instrument;
16
16
17
17
use super :: trait_goals:: TraitGoalProvenVia ;
18
18
use super :: { has_only_region_constraints, inspect} ;
@@ -368,8 +368,7 @@ where
368
368
} ;
369
369
370
370
if normalized_self_ty. is_ty_var ( ) {
371
- debug ! ( "self type has been normalized to infer" ) ;
372
- return self . forced_ambiguity ( MaybeCause :: Ambiguity ) . into_iter ( ) . collect ( ) ;
371
+ return self . try_assemble_bounds_via_registered_opaque ( goal, normalized_self_ty) ;
373
372
}
374
373
375
374
let goal: Goal < I , G > =
@@ -874,6 +873,60 @@ where
874
873
}
875
874
}
876
875
876
+ fn try_assemble_bounds_via_registered_opaque < G : GoalKind < D > > (
877
+ & mut self ,
878
+ goal : Goal < I , G > ,
879
+ self_ty : I :: Ty ,
880
+ ) -> Vec < Candidate < I > > {
881
+ //println!("for goal {goal:#?} and {self_ty:?}, we found an alias: {:#?}", self.find_sup_as_registered_opaque(self_ty));
882
+
883
+ let Some ( alias_ty) = self . find_sup_as_registered_opaque ( self_ty) else {
884
+ return self . forced_ambiguity ( MaybeCause :: Ambiguity ) . into_iter ( ) . collect ( ) ;
885
+ } ;
886
+
887
+ let mut candidates = vec ! [ ] ;
888
+ for item_bound in
889
+ self . cx ( ) . item_self_bounds ( alias_ty. def_id ) . iter_instantiated ( self . cx ( ) , alias_ty. args )
890
+ {
891
+ // TODO: comment
892
+ let assumption =
893
+ item_bound. fold_with ( & mut ReplaceOpaque { cx : self . cx ( ) , alias_ty, self_ty } ) ;
894
+ candidates. extend ( G :: probe_and_match_goal_against_assumption (
895
+ self ,
896
+ CandidateSource :: AliasBound ,
897
+ goal,
898
+ assumption,
899
+ |ecx| ecx. evaluate_added_goals_and_make_canonical_response ( Certainty :: AMBIGUOUS ) ,
900
+ ) ) ;
901
+ }
902
+
903
+ struct ReplaceOpaque < I : Interner > {
904
+ cx : I ,
905
+ alias_ty : ty:: AliasTy < I > ,
906
+ self_ty : I :: Ty ,
907
+ }
908
+ impl < I : Interner > TypeFolder < I > for ReplaceOpaque < I > {
909
+ fn cx ( & self ) -> I {
910
+ self . cx
911
+ }
912
+ fn fold_ty ( & mut self , ty : I :: Ty ) -> I :: Ty {
913
+ if let ty:: Alias ( ty:: Opaque , alias_ty) = ty. kind ( ) {
914
+ if alias_ty == self . alias_ty {
915
+ return self . self_ty ;
916
+ }
917
+ }
918
+ ty. super_fold_with ( self )
919
+ }
920
+ }
921
+
922
+ // TODO:
923
+ if candidates. is_empty ( ) {
924
+ candidates. extend ( self . forced_ambiguity ( MaybeCause :: Ambiguity ) ) ;
925
+ }
926
+
927
+ candidates
928
+ }
929
+
877
930
/// Assemble and merge candidates for goals which are related to an underlying trait
878
931
/// goal. Right now, this is normalizes-to and host effect goals.
879
932
///
0 commit comments