@@ -290,6 +290,31 @@ impl<'tcx> BestObligation<'tcx> {
290
290
ControlFlow :: Continue ( ( ) )
291
291
}
292
292
}
293
+
294
+ /// It is likely that `NormalizesTo` failed because the alias is not well-formed.
295
+ /// As we only enter `RigidAlias` candidates if the trait bound of the associated type
296
+ /// holds, we discard these candidates in `non_trivial_candidates` and always manually
297
+ /// check this here.
298
+ fn detect_non_well_formed_alias (
299
+ & mut self ,
300
+ goal : & inspect:: InspectGoal < ' _ , ' tcx > ,
301
+ alias : ty:: AliasTerm < ' tcx > ,
302
+ ) -> ControlFlow < PredicateObligation < ' tcx > > {
303
+ let tcx = goal. infcx ( ) . tcx ;
304
+ let obligation = Obligation :: new (
305
+ tcx,
306
+ self . obligation . cause . clone ( ) ,
307
+ goal. goal ( ) . param_env ,
308
+ alias. trait_ref ( tcx) ,
309
+ ) ;
310
+ self . with_derived_obligation ( obligation, |this| {
311
+ goal. infcx ( ) . visit_proof_tree_at_depth (
312
+ goal. goal ( ) . with ( tcx, alias. trait_ref ( tcx) ) ,
313
+ goal. depth ( ) + 1 ,
314
+ this,
315
+ )
316
+ } )
317
+ }
293
318
}
294
319
295
320
impl < ' tcx > ProofTreeVisitor < ' tcx > for BestObligation < ' tcx > {
@@ -321,23 +346,7 @@ impl<'tcx> ProofTreeVisitor<'tcx> for BestObligation<'tcx> {
321
346
| ty:: AliasTermKind :: ProjectionConst = pred. alias . kind ( tcx) =>
322
347
{
323
348
self . detect_error_in_self_ty_normalization ( goal, pred. alias . self_ty ( ) ) ?;
324
- // It is likely that `NormalizesTo` failed because the alias is not well-formed.
325
- // As we only enter `RigidAlias` candidates if the trait bound of the associated type
326
- // holds, we discard these candidates in `non_trivial_candidates` and always manually
327
- // check this here.
328
- let obligation = Obligation :: new (
329
- tcx,
330
- self . obligation . cause . clone ( ) ,
331
- goal. goal ( ) . param_env ,
332
- pred. alias . trait_ref ( tcx) ,
333
- ) ;
334
- self . with_derived_obligation ( obligation, |this| {
335
- goal. infcx ( ) . visit_proof_tree_at_depth (
336
- goal. goal ( ) . with ( tcx, pred. alias . trait_ref ( tcx) ) ,
337
- goal. depth ( ) + 1 ,
338
- this,
339
- )
340
- } ) ?;
349
+ self . detect_non_well_formed_alias ( goal, pred. alias ) ?;
341
350
}
342
351
Some ( _) | None => { }
343
352
}
0 commit comments