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