Skip to content

Commit 0c46d8c

Browse files
Actually just remove the special case altogether
1 parent a94beac commit 0c46d8c

File tree

1 file changed

+47
-76
lines changed

1 file changed

+47
-76
lines changed

compiler/rustc_hir_analysis/src/collect/predicates_of.rs

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

0 commit comments

Comments
 (0)