@@ -461,83 +461,55 @@ pub(super) fn explicit_predicates_of<'tcx>(
461
461
}
462
462
}
463
463
} else {
464
- if matches ! ( def_kind, DefKind :: AnonConst ) && tcx. features ( ) . generic_const_exprs {
465
- let hir_id = tcx. local_def_id_to_hir_id ( def_id) ;
466
- let parent_def_id = tcx. hir ( ) . get_parent_item ( hir_id) ;
467
-
468
- if let Some ( defaulted_param_def_id) =
469
- tcx. hir ( ) . opt_const_param_default_param_def_id ( hir_id)
470
- {
471
- // In `generics_of` we set the generics' parent to be our parent's parent which means that
472
- // we lose out on the predicates of our actual parent if we dont return those predicates here.
473
- // (See comment in `generics_of` for more information on why the parent shenanigans is necessary)
474
- //
475
- // struct Foo<T, const N: usize = { <T as Trait>::ASSOC }>(T) where T: Trait;
476
- // ^^^ ^^^^^^^^^^^^^^^^^^^^^^^ the def id we are calling
477
- // ^^^ explicit_predicates_of on
478
- // parent item we dont have set as the
479
- // parent of generics returned by `generics_of`
480
- //
481
- // In the above code we want the anon const to have predicates in its param env for `T: Trait`
482
- // and we would be calling `explicit_predicates_of(Foo)` here
483
- let parent_preds = tcx. explicit_predicates_of ( parent_def_id) ;
484
-
485
- // If we dont filter out `ConstArgHasType` predicates then every single defaulted const parameter
486
- // will ICE because of #106994. FIXME(generic_const_exprs): remove this when a more general solution
487
- // to #106994 is implemented.
488
- let filtered_predicates = parent_preds
489
- . predicates
490
- . into_iter ( )
491
- . filter ( |( pred, _) | {
492
- if let ty:: ClauseKind :: ConstArgHasType ( ct, _) = pred. kind ( ) . skip_binder ( ) {
493
- match ct. kind ( ) {
494
- ty:: ConstKind :: Param ( param_const) => {
495
- let defaulted_param_idx = tcx
496
- . generics_of ( parent_def_id)
497
- . param_def_id_to_index [ & defaulted_param_def_id. to_def_id ( ) ] ;
498
- param_const. index < defaulted_param_idx
499
- }
500
- _ => bug ! (
501
- "`ConstArgHasType` in `predicates_of`\
502
- that isn't a `Param` const"
503
- ) ,
464
+ if matches ! ( def_kind, DefKind :: AnonConst )
465
+ && tcx. features ( ) . generic_const_exprs
466
+ && let Some ( defaulted_param_def_id) =
467
+ tcx. hir ( ) . opt_const_param_default_param_def_id ( tcx. local_def_id_to_hir_id ( def_id) )
468
+ {
469
+ // In `generics_of` we set the generics' parent to be our parent's parent which means that
470
+ // we lose out on the predicates of our actual parent if we dont return those predicates here.
471
+ // (See comment in `generics_of` for more information on why the parent shenanigans is necessary)
472
+ //
473
+ // struct Foo<T, const N: usize = { <T as Trait>::ASSOC }>(T) where T: Trait;
474
+ // ^^^ ^^^^^^^^^^^^^^^^^^^^^^^ the def id we are calling
475
+ // ^^^ explicit_predicates_of on
476
+ // parent item we dont have set as the
477
+ // parent of generics returned by `generics_of`
478
+ //
479
+ // In the above code we want the anon const to have predicates in its param env for `T: Trait`
480
+ // and we would be calling `explicit_predicates_of(Foo)` here
481
+ let parent_def_id = tcx. local_parent ( def_id) ;
482
+ let parent_preds = tcx. explicit_predicates_of ( parent_def_id) ;
483
+
484
+ // If we dont filter out `ConstArgHasType` predicates then every single defaulted const parameter
485
+ // will ICE because of #106994. FIXME(generic_const_exprs): remove this when a more general solution
486
+ // to #106994 is implemented.
487
+ let filtered_predicates = parent_preds
488
+ . predicates
489
+ . into_iter ( )
490
+ . filter ( |( pred, _) | {
491
+ if let ty:: ClauseKind :: ConstArgHasType ( ct, _) = pred. kind ( ) . skip_binder ( ) {
492
+ match ct. kind ( ) {
493
+ ty:: ConstKind :: Param ( param_const) => {
494
+ let defaulted_param_idx = tcx
495
+ . generics_of ( parent_def_id)
496
+ . param_def_id_to_index [ & defaulted_param_def_id. to_def_id ( ) ] ;
497
+ param_const. index < defaulted_param_idx
504
498
}
505
- } else {
506
- true
499
+ _ => bug ! (
500
+ "`ConstArgHasType` in `predicates_of`\
501
+ that isn't a `Param` const"
502
+ ) ,
507
503
}
508
- } )
509
- . cloned ( ) ;
510
- return GenericPredicates {
511
- parent : parent_preds. parent ,
512
- predicates : { tcx. arena . alloc_from_iter ( filtered_predicates) } ,
513
- } ;
514
- }
515
-
516
- let parent_def_kind = tcx. def_kind ( parent_def_id) ;
517
- if matches ! ( parent_def_kind, DefKind :: OpaqueTy ) {
518
- // In `instantiate_identity` we inherit the predicates of our parent.
519
- // However, opaque types do not have a parent (see `gather_explicit_predicates_of`), which means
520
- // that we lose out on the predicates of our actual parent if we dont return those predicates here.
521
- //
522
- //
523
- // fn foo<T: Trait>() -> impl Iterator<Output = Another<{ <T as Trait>::ASSOC }> > { todo!() }
524
- // ^^^^^^^^^^^^^^^^^^^ the def id we are calling
525
- // explicit_predicates_of on
526
- //
527
- // In the above code we want the anon const to have predicates in its param env for `T: Trait`.
528
- // However, the anon const cannot inherit predicates from its parent since it's opaque.
529
- //
530
- // To fix this, we call `explicit_predicates_of` directly on `foo`, the parent's parent.
531
-
532
- // In the above example this is `foo::{opaque#0}` or `impl Iterator`
533
- let parent_hir_id = tcx. local_def_id_to_hir_id ( parent_def_id. def_id ) ;
534
-
535
- // In the above example this is the function `foo`
536
- let item_def_id = tcx. hir ( ) . get_parent_item ( parent_hir_id) ;
537
-
538
- // In the above code example we would be calling `explicit_predicates_of(foo)` here
539
- return tcx. explicit_predicates_of ( item_def_id) ;
540
- }
504
+ } else {
505
+ true
506
+ }
507
+ } )
508
+ . cloned ( ) ;
509
+ return GenericPredicates {
510
+ parent : parent_preds. parent ,
511
+ predicates : { tcx. arena . alloc_from_iter ( filtered_predicates) } ,
512
+ } ;
541
513
}
542
514
gather_explicit_predicates_of ( tcx, def_id)
543
515
}
0 commit comments