@@ -61,15 +61,36 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
61
61
goal : Goal < ' tcx , ty:: Predicate < ' tcx > > ,
62
62
span : Span ,
63
63
) -> Option < Certainty > {
64
- if let Some ( trait_pred) = goal. predicate . as_trait_clause ( )
65
- && self . shallow_resolve ( trait_pred. self_ty ( ) . skip_binder ( ) ) . is_ty_var ( )
66
- // We don't do this fast path when opaques are defined since we may
67
- // eventually use opaques to incompletely guide inference via ty var
68
- // self types.
69
- // FIXME: Properly consider opaques here.
70
- && self . inner . borrow_mut ( ) . opaque_types ( ) . is_empty ( )
71
- {
72
- return Some ( Certainty :: AMBIGUOUS ) ;
64
+ if let Some ( trait_pred) = goal. predicate . as_trait_clause ( ) {
65
+ if self . shallow_resolve ( trait_pred. self_ty ( ) . skip_binder ( ) ) . is_ty_var ( )
66
+ // We don't do this fast path when opaques are defined since we may
67
+ // eventually use opaques to incompletely guide inference via ty var
68
+ // self types.
69
+ // FIXME: Properly consider opaques here.
70
+ && self . inner . borrow_mut ( ) . opaque_types ( ) . is_empty ( )
71
+ {
72
+ return Some ( Certainty :: AMBIGUOUS ) ;
73
+ }
74
+
75
+ if trait_pred. polarity ( ) == ty:: PredicatePolarity :: Positive {
76
+ match self . 0 . tcx . as_lang_item ( trait_pred. def_id ( ) ) {
77
+ Some ( LangItem :: Sized )
78
+ if self
79
+ . resolve_vars_if_possible ( trait_pred. self_ty ( ) . skip_binder ( ) )
80
+ . is_trivially_sized ( self . 0 . tcx ) =>
81
+ {
82
+ return Some ( Certainty :: Yes ) ;
83
+ }
84
+ Some ( LangItem :: Copy | LangItem :: Clone )
85
+ if self
86
+ . resolve_vars_if_possible ( trait_pred. self_ty ( ) . skip_binder ( ) )
87
+ . is_trivially_pure_clone_copy ( ) =>
88
+ {
89
+ return Some ( Certainty :: Yes ) ;
90
+ }
91
+ _ => { }
92
+ }
93
+ }
73
94
}
74
95
75
96
let pred = goal. predicate . kind ( ) ;
@@ -94,21 +115,6 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
94
115
95
116
Some ( Certainty :: Yes )
96
117
}
97
- ty:: PredicateKind :: Clause ( ty:: ClauseKind :: Trait ( trait_pred) ) => {
98
- match self . 0 . tcx . as_lang_item ( trait_pred. def_id ( ) ) {
99
- Some ( LangItem :: Sized )
100
- if trait_pred. self_ty ( ) . is_trivially_sized ( self . 0 . tcx ) =>
101
- {
102
- Some ( Certainty :: Yes )
103
- }
104
- Some ( LangItem :: Copy | LangItem :: Clone )
105
- if trait_pred. self_ty ( ) . is_trivially_pure_clone_copy ( ) =>
106
- {
107
- Some ( Certainty :: Yes )
108
- }
109
- _ => None ,
110
- }
111
- }
112
118
ty:: PredicateKind :: Subtype ( ty:: SubtypePredicate { a, b, .. } )
113
119
| ty:: PredicateKind :: Coerce ( ty:: CoercePredicate { a, b } ) => {
114
120
if self . shallow_resolve ( a) . is_ty_var ( ) && self . shallow_resolve ( b) . is_ty_var ( ) {
0 commit comments