@@ -86,8 +86,9 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
8686 ) -> QueryResult < ' tcx > {
8787 if let Some ( poly_trait_pred) = assumption. to_opt_poly_trait_pred ( )
8888 && poly_trait_pred. def_id ( ) == goal. predicate . def_id ( )
89+ && poly_trait_pred. polarity ( ) == goal. predicate . polarity
8990 {
90- // FIXME: Constness and polarity
91+ // FIXME: Constness
9192 ecx. probe ( |ecx| {
9293 let assumption_trait_pred =
9394 ecx. instantiate_binder_with_infer ( poly_trait_pred) ;
@@ -111,6 +112,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
111112 ) -> QueryResult < ' tcx > {
112113 if let Some ( poly_trait_pred) = assumption. to_opt_poly_trait_pred ( )
113114 && poly_trait_pred. def_id ( ) == goal. predicate . def_id ( )
115+ && poly_trait_pred. polarity ( ) == goal. predicate . polarity
114116 {
115117 // FIXME: Constness and polarity
116118 ecx. probe ( |ecx| {
@@ -147,6 +149,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
147149 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
148150 goal : Goal < ' tcx , Self > ,
149151 ) -> QueryResult < ' tcx > {
152+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
153+ return Err ( NoSolution ) ;
154+ }
155+
150156 if let Some ( result) = ecx. disqualify_auto_trait_candidate_due_to_possible_impl ( goal) {
151157 return result;
152158 }
@@ -161,6 +167,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
161167 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
162168 goal : Goal < ' tcx , Self > ,
163169 ) -> QueryResult < ' tcx > {
170+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
171+ return Err ( NoSolution ) ;
172+ }
173+
164174 let tcx = ecx. tcx ( ) ;
165175
166176 ecx. probe ( |ecx| {
@@ -176,6 +186,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
176186 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
177187 goal : Goal < ' tcx , Self > ,
178188 ) -> QueryResult < ' tcx > {
189+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
190+ return Err ( NoSolution ) ;
191+ }
192+
179193 ecx. probe_and_evaluate_goal_for_constituent_tys (
180194 goal,
181195 structural_traits:: instantiate_constituent_tys_for_sized_trait,
@@ -186,6 +200,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
186200 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
187201 goal : Goal < ' tcx , Self > ,
188202 ) -> QueryResult < ' tcx > {
203+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
204+ return Err ( NoSolution ) ;
205+ }
206+
189207 ecx. probe_and_evaluate_goal_for_constituent_tys (
190208 goal,
191209 structural_traits:: instantiate_constituent_tys_for_copy_clone_trait,
@@ -196,6 +214,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
196214 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
197215 goal : Goal < ' tcx , Self > ,
198216 ) -> QueryResult < ' tcx > {
217+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
218+ return Err ( NoSolution ) ;
219+ }
220+
199221 if goal. predicate . self_ty ( ) . has_non_region_infer ( ) {
200222 return ecx. evaluate_added_goals_and_make_canonical_response ( Certainty :: AMBIGUOUS ) ;
201223 }
@@ -217,6 +239,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
217239 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
218240 goal : Goal < ' tcx , Self > ,
219241 ) -> QueryResult < ' tcx > {
242+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
243+ return Err ( NoSolution ) ;
244+ }
245+
220246 if let ty:: FnPtr ( ..) = goal. predicate . self_ty ( ) . kind ( ) {
221247 ecx. evaluate_added_goals_and_make_canonical_response ( Certainty :: Yes )
222248 } else {
@@ -229,6 +255,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
229255 goal : Goal < ' tcx , Self > ,
230256 goal_kind : ty:: ClosureKind ,
231257 ) -> QueryResult < ' tcx > {
258+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
259+ return Err ( NoSolution ) ;
260+ }
261+
232262 let tcx = ecx. tcx ( ) ;
233263 let tupled_inputs_and_output =
234264 match structural_traits:: extract_tupled_inputs_and_output_from_callable (
@@ -259,6 +289,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
259289 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
260290 goal : Goal < ' tcx , Self > ,
261291 ) -> QueryResult < ' tcx > {
292+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
293+ return Err ( NoSolution ) ;
294+ }
295+
262296 if let ty:: Tuple ( ..) = goal. predicate . self_ty ( ) . kind ( ) {
263297 ecx. evaluate_added_goals_and_make_canonical_response ( Certainty :: Yes )
264298 } else {
@@ -268,15 +302,23 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
268302
269303 fn consider_builtin_pointee_candidate (
270304 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
271- _goal : Goal < ' tcx , Self > ,
305+ goal : Goal < ' tcx , Self > ,
272306 ) -> QueryResult < ' tcx > {
307+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
308+ return Err ( NoSolution ) ;
309+ }
310+
273311 ecx. evaluate_added_goals_and_make_canonical_response ( Certainty :: Yes )
274312 }
275313
276314 fn consider_builtin_future_candidate (
277315 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
278316 goal : Goal < ' tcx , Self > ,
279317 ) -> QueryResult < ' tcx > {
318+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
319+ return Err ( NoSolution ) ;
320+ }
321+
280322 let ty:: Generator ( def_id, _, _) = * goal. predicate . self_ty ( ) . kind ( ) else {
281323 return Err ( NoSolution ) ;
282324 } ;
@@ -297,6 +339,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
297339 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
298340 goal : Goal < ' tcx , Self > ,
299341 ) -> QueryResult < ' tcx > {
342+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
343+ return Err ( NoSolution ) ;
344+ }
345+
300346 let self_ty = goal. predicate . self_ty ( ) ;
301347 let ty:: Generator ( def_id, substs, _) = * self_ty. kind ( ) else {
302348 return Err ( NoSolution ) ;
@@ -326,6 +372,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
326372 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
327373 goal : Goal < ' tcx , Self > ,
328374 ) -> QueryResult < ' tcx > {
375+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
376+ return Err ( NoSolution ) ;
377+ }
378+
329379 let tcx = ecx. tcx ( ) ;
330380 let a_ty = goal. predicate . self_ty ( ) ;
331381 let b_ty = goal. predicate . trait_ref . substs . type_at ( 1 ) ;
@@ -447,6 +497,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
447497 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
448498 goal : Goal < ' tcx , Self > ,
449499 ) -> Vec < CanonicalResponse < ' tcx > > {
500+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
501+ return vec ! [ ] ;
502+ }
503+
450504 let tcx = ecx. tcx ( ) ;
451505
452506 let a_ty = goal. predicate . self_ty ( ) ;
@@ -521,8 +575,12 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
521575
522576 fn consider_builtin_discriminant_kind_candidate (
523577 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
524- _goal : Goal < ' tcx , Self > ,
578+ goal : Goal < ' tcx , Self > ,
525579 ) -> QueryResult < ' tcx > {
580+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
581+ return Err ( NoSolution ) ;
582+ }
583+
526584 // `DiscriminantKind` is automatically implemented for every type.
527585 ecx. evaluate_added_goals_and_make_canonical_response ( Certainty :: Yes )
528586 }
@@ -531,6 +589,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
531589 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
532590 goal : Goal < ' tcx , Self > ,
533591 ) -> QueryResult < ' tcx > {
592+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
593+ return Err ( NoSolution ) ;
594+ }
595+
534596 if !goal. param_env . is_const ( ) {
535597 // `Destruct` is automatically implemented for every type in
536598 // non-const environments.
@@ -545,6 +607,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
545607 ecx : & mut EvalCtxt < ' _ , ' tcx > ,
546608 goal : Goal < ' tcx , Self > ,
547609 ) -> QueryResult < ' tcx > {
610+ if goal. predicate . polarity != ty:: ImplPolarity :: Positive {
611+ return Err ( NoSolution ) ;
612+ }
613+
548614 // `rustc_transmute` does not have support for type or const params
549615 if goal. has_non_region_placeholders ( ) {
550616 return Err ( NoSolution ) ;
0 commit comments