Skip to content

Commit 671a2f7

Browse files
authored
Rollup merge of #122719 - oli-obk:nested_static_feed_hir, r=fee1-dead
Ensure nested statics have a HIR node to prevent various queries from ICEing fixes rust-lang/miri#3389
2 parents 6561890 + 3a09680 commit 671a2f7

File tree

12 files changed

+45
-49
lines changed

12 files changed

+45
-49
lines changed

Diff for: compiler/rustc_ast_lowering/src/index.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub(super) fn index_hir<'hir>(
5555
OwnerNode::TraitItem(item) => collector.visit_trait_item(item),
5656
OwnerNode::ImplItem(item) => collector.visit_impl_item(item),
5757
OwnerNode::ForeignItem(item) => collector.visit_foreign_item(item),
58-
OwnerNode::AssocOpaqueTy(..) => unreachable!(),
58+
OwnerNode::Synthetic => unreachable!(),
5959
};
6060

6161
for (local_id, node) in collector.nodes.iter_enumerated() {

Diff for: compiler/rustc_const_eval/src/interpret/intern.rs

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ fn intern_as_new_static<'tcx>(
111111
feed.generics_of(tcx.generics_of(static_id).clone());
112112
feed.def_ident_span(tcx.def_ident_span(static_id));
113113
feed.explicit_predicates_of(tcx.explicit_predicates_of(static_id));
114+
115+
feed.feed_hir()
114116
}
115117

116118
/// How a constant value should be interned.

Diff for: compiler/rustc_hir/src/hir.rs

+9-13
Original file line numberDiff line numberDiff line change
@@ -2552,11 +2552,6 @@ pub struct OpaqueTy<'hir> {
25522552
pub in_trait: bool,
25532553
}
25542554

2555-
#[derive(Copy, Clone, Debug, HashStable_Generic)]
2556-
pub struct AssocOpaqueTy {
2557-
// Add some data if necessary
2558-
}
2559-
25602555
/// From whence the opaque type came.
25612556
#[derive(Copy, Clone, PartialEq, Eq, Debug, HashStable_Generic)]
25622557
pub enum OpaqueTyOrigin {
@@ -3367,7 +3362,7 @@ pub enum OwnerNode<'hir> {
33673362
TraitItem(&'hir TraitItem<'hir>),
33683363
ImplItem(&'hir ImplItem<'hir>),
33693364
Crate(&'hir Mod<'hir>),
3370-
AssocOpaqueTy(&'hir AssocOpaqueTy),
3365+
Synthetic,
33713366
}
33723367

33733368
impl<'hir> OwnerNode<'hir> {
@@ -3377,7 +3372,7 @@ impl<'hir> OwnerNode<'hir> {
33773372
| OwnerNode::ForeignItem(ForeignItem { ident, .. })
33783373
| OwnerNode::ImplItem(ImplItem { ident, .. })
33793374
| OwnerNode::TraitItem(TraitItem { ident, .. }) => Some(*ident),
3380-
OwnerNode::Crate(..) | OwnerNode::AssocOpaqueTy(..) => None,
3375+
OwnerNode::Crate(..) | OwnerNode::Synthetic => None,
33813376
}
33823377
}
33833378

@@ -3390,7 +3385,7 @@ impl<'hir> OwnerNode<'hir> {
33903385
| OwnerNode::ImplItem(ImplItem { span, .. })
33913386
| OwnerNode::TraitItem(TraitItem { span, .. }) => span,
33923387
OwnerNode::Crate(Mod { spans: ModSpans { inner_span, .. }, .. }) => inner_span,
3393-
OwnerNode::AssocOpaqueTy(..) => unreachable!(),
3388+
OwnerNode::Synthetic => unreachable!(),
33943389
}
33953390
}
33963391

@@ -3449,7 +3444,7 @@ impl<'hir> OwnerNode<'hir> {
34493444
| OwnerNode::ImplItem(ImplItem { owner_id, .. })
34503445
| OwnerNode::ForeignItem(ForeignItem { owner_id, .. }) => *owner_id,
34513446
OwnerNode::Crate(..) => crate::CRATE_HIR_ID.owner,
3452-
OwnerNode::AssocOpaqueTy(..) => unreachable!(),
3447+
OwnerNode::Synthetic => unreachable!(),
34533448
}
34543449
}
34553450

@@ -3493,7 +3488,7 @@ impl<'hir> Into<Node<'hir>> for OwnerNode<'hir> {
34933488
OwnerNode::ImplItem(n) => Node::ImplItem(n),
34943489
OwnerNode::TraitItem(n) => Node::TraitItem(n),
34953490
OwnerNode::Crate(n) => Node::Crate(n),
3496-
OwnerNode::AssocOpaqueTy(n) => Node::AssocOpaqueTy(n),
3491+
OwnerNode::Synthetic => Node::Synthetic,
34973492
}
34983493
}
34993494
}
@@ -3531,7 +3526,8 @@ pub enum Node<'hir> {
35313526
WhereBoundPredicate(&'hir WhereBoundPredicate<'hir>),
35323527
// FIXME: Merge into `Node::Infer`.
35333528
ArrayLenInfer(&'hir InferArg),
3534-
AssocOpaqueTy(&'hir AssocOpaqueTy),
3529+
// Created by query feeding
3530+
Synthetic,
35353531
// Span by reference to minimize `Node`'s size
35363532
#[allow(rustc::pass_by_value)]
35373533
Err(&'hir Span),
@@ -3582,7 +3578,7 @@ impl<'hir> Node<'hir> {
35823578
| Node::Infer(..)
35833579
| Node::WhereBoundPredicate(..)
35843580
| Node::ArrayLenInfer(..)
3585-
| Node::AssocOpaqueTy(..)
3581+
| Node::Synthetic
35863582
| Node::Err(..) => None,
35873583
}
35883584
}
@@ -3695,7 +3691,7 @@ impl<'hir> Node<'hir> {
36953691
Node::TraitItem(i) => Some(OwnerNode::TraitItem(i)),
36963692
Node::ImplItem(i) => Some(OwnerNode::ImplItem(i)),
36973693
Node::Crate(i) => Some(OwnerNode::Crate(i)),
3698-
Node::AssocOpaqueTy(i) => Some(OwnerNode::AssocOpaqueTy(i)),
3694+
Node::Synthetic => Some(OwnerNode::Synthetic),
36993695
_ => None,
37003696
}
37013697
}

Diff for: compiler/rustc_hir_analysis/src/check/wfcheck.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ fn check_well_formed(tcx: TyCtxt<'_>, def_id: hir::OwnerId) -> Result<(), ErrorG
196196
hir::OwnerNode::TraitItem(item) => check_trait_item(tcx, item),
197197
hir::OwnerNode::ImplItem(item) => check_impl_item(tcx, item),
198198
hir::OwnerNode::ForeignItem(item) => check_foreign_item(tcx, item),
199-
hir::OwnerNode::AssocOpaqueTy(..) => unreachable!(),
199+
hir::OwnerNode::Synthetic => unreachable!(),
200200
};
201201

202202
if let Some(generics) = node.generics() {

Diff for: compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ fn resolve_bound_vars(tcx: TyCtxt<'_>, local_def_id: hir::OwnerId) -> ResolveBou
262262
visitor.visit_impl_item(item)
263263
}
264264
hir::OwnerNode::Crate(_) => {}
265-
hir::OwnerNode::AssocOpaqueTy(..) => unreachable!(),
265+
hir::OwnerNode::Synthetic => unreachable!(),
266266
}
267267

268268
let mut rl = ResolveBoundVars::default();

Diff for: compiler/rustc_hir_pretty/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ impl<'a> State<'a> {
121121
self.print_bounds(":", pred.bounds);
122122
}
123123
Node::ArrayLenInfer(_) => self.word("_"),
124-
Node::AssocOpaqueTy(..) => unreachable!(),
124+
Node::Synthetic => unreachable!(),
125125
Node::Err(_) => self.word("/*ERROR*/"),
126126
}
127127
}

Diff for: compiler/rustc_infer/src/infer/error_reporting/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2553,7 +2553,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
25532553
hir::OwnerNode::ImplItem(i) => visitor.visit_impl_item(i),
25542554
hir::OwnerNode::TraitItem(i) => visitor.visit_trait_item(i),
25552555
hir::OwnerNode::Crate(_) => bug!("OwnerNode::Crate doesn't not have generics"),
2556-
hir::OwnerNode::AssocOpaqueTy(..) => unreachable!(),
2556+
hir::OwnerNode::Synthetic => unreachable!(),
25572557
}
25582558

25592559
let ast_generics = self.tcx.hir().get_generics(lifetime_scope).unwrap();

Diff for: compiler/rustc_lint/src/levels.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ fn shallow_lint_levels_on(tcx: TyCtxt<'_>, owner: hir::OwnerId) -> ShallowLintLe
191191
levels.add_id(hir::CRATE_HIR_ID);
192192
levels.visit_mod(mod_, mod_.spans.inner_span, hir::CRATE_HIR_ID)
193193
}
194-
hir::OwnerNode::AssocOpaqueTy(..) => unreachable!(),
194+
hir::OwnerNode::Synthetic => unreachable!(),
195195
},
196196
}
197197

Diff for: compiler/rustc_middle/src/hir/map/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ impl<'hir> Map<'hir> {
914914
Node::Crate(item) => item.spans.inner_span,
915915
Node::WhereBoundPredicate(pred) => pred.span,
916916
Node::ArrayLenInfer(inf) => inf.span,
917-
Node::AssocOpaqueTy(..) => unreachable!(),
917+
Node::Synthetic => unreachable!(),
918918
Node::Err(span) => *span,
919919
}
920920
}
@@ -1179,7 +1179,7 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String {
11791179
Node::Crate(..) => String::from("(root_crate)"),
11801180
Node::WhereBoundPredicate(_) => node_str("where bound predicate"),
11811181
Node::ArrayLenInfer(_) => node_str("array len infer"),
1182-
Node::AssocOpaqueTy(..) => unreachable!(),
1182+
Node::Synthetic => unreachable!(),
11831183
Node::Err(_) => node_str("error"),
11841184
}
11851185
}

Diff for: compiler/rustc_middle/src/ty/context.rs

+21
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,27 @@ impl<'tcx> TyCtxtFeed<'tcx, LocalDefId> {
596596
pub fn feed_owner_id(&self) -> TyCtxtFeed<'tcx, hir::OwnerId> {
597597
TyCtxtFeed { tcx: self.tcx, key: hir::OwnerId { def_id: self.key } }
598598
}
599+
600+
// Fills in all the important parts needed by HIR queries
601+
pub fn feed_hir(&self) {
602+
self.local_def_id_to_hir_id(HirId::make_owner(self.def_id()));
603+
604+
let node = hir::OwnerNode::Synthetic;
605+
let bodies = Default::default();
606+
let attrs = hir::AttributeMap::EMPTY;
607+
608+
let (opt_hash_including_bodies, _) = self.tcx.hash_owner_nodes(node, &bodies, &attrs.map);
609+
let node = node.into();
610+
self.opt_hir_owner_nodes(Some(self.tcx.arena.alloc(hir::OwnerNodes {
611+
opt_hash_including_bodies,
612+
nodes: IndexVec::from_elem_n(
613+
hir::ParentedNode { parent: hir::ItemLocalId::INVALID, node },
614+
1,
615+
),
616+
bodies,
617+
})));
618+
self.feed_owner_id().hir_attrs(attrs);
619+
}
599620
}
600621

601622
/// The central data structure of the compiler. It stores references

Diff for: compiler/rustc_passes/src/reachable.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ impl<'tcx> ReachableContext<'tcx> {
247247
| Node::Field(_)
248248
| Node::Ty(_)
249249
| Node::Crate(_)
250-
| Node::AssocOpaqueTy(..) => {}
250+
| Node::Synthetic => {}
251251
_ => {
252252
bug!(
253253
"found unexpected node kind in worklist: {} ({:?})",

Diff for: compiler/rustc_ty_utils/src/assoc.rs

+4-27
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use rustc_data_structures::fx::FxIndexSet;
2+
use rustc_hir as hir;
23
use rustc_hir::def::DefKind;
34
use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId};
45
use rustc_hir::intravisit::{self, Visitor};
5-
use rustc_hir::{self as hir, HirId};
6-
use rustc_index::IndexVec;
76
use rustc_middle::query::Providers;
8-
use rustc_middle::ty::{self, ImplTraitInTraitData, TyCtxt, TyCtxtFeed};
7+
use rustc_middle::ty::{self, ImplTraitInTraitData, TyCtxt};
98
use rustc_span::symbol::kw;
109

1110
pub(crate) fn provide(providers: &mut Providers) {
@@ -238,28 +237,6 @@ fn associated_types_for_impl_traits_in_associated_fn(
238237
}
239238
}
240239

241-
fn feed_hir(feed: &TyCtxtFeed<'_, LocalDefId>) {
242-
feed.local_def_id_to_hir_id(HirId::make_owner(feed.def_id()));
243-
244-
let node = hir::OwnerNode::AssocOpaqueTy(&hir::AssocOpaqueTy {});
245-
let bodies = Default::default();
246-
let attrs = hir::AttributeMap::EMPTY;
247-
248-
let (opt_hash_including_bodies, _) = feed.tcx.hash_owner_nodes(node, &bodies, &attrs.map);
249-
feed.opt_hir_owner_nodes(Some(feed.tcx.arena.alloc(hir::OwnerNodes {
250-
opt_hash_including_bodies,
251-
nodes: IndexVec::from_elem_n(
252-
hir::ParentedNode {
253-
parent: hir::ItemLocalId::INVALID,
254-
node: hir::Node::AssocOpaqueTy(&hir::AssocOpaqueTy {}),
255-
},
256-
1,
257-
),
258-
bodies,
259-
})));
260-
feed.feed_owner_id().hir_attrs(attrs);
261-
}
262-
263240
/// Given an `opaque_ty_def_id` corresponding to an `impl Trait` in an associated
264241
/// function from a trait, synthesize an associated type for that `impl Trait`
265242
/// that inherits properties that we infer from the method and the opaque type.
@@ -281,7 +258,7 @@ fn associated_type_for_impl_trait_in_trait(
281258
let local_def_id = trait_assoc_ty.def_id();
282259
let def_id = local_def_id.to_def_id();
283260

284-
feed_hir(&trait_assoc_ty);
261+
trait_assoc_ty.feed_hir();
285262

286263
// Copy span of the opaque.
287264
trait_assoc_ty.def_ident_span(Some(span));
@@ -335,7 +312,7 @@ fn associated_type_for_impl_trait_in_impl(
335312
let local_def_id = impl_assoc_ty.def_id();
336313
let def_id = local_def_id.to_def_id();
337314

338-
feed_hir(&impl_assoc_ty);
315+
impl_assoc_ty.feed_hir();
339316

340317
// Copy span of the opaque.
341318
impl_assoc_ty.def_ident_span(Some(span));

0 commit comments

Comments
 (0)