Fill in def_span
when creating def ids.
This makes sure that ICEing because of def ids created outside of ast lowering will be able to produce a query backtrace and not cause a double panic because of trying to call the `def_span` query
This commit is contained in:
parent
a0bdb4b498
commit
ab75d777de
@ -222,7 +222,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
// Wrap the expression in an AnonConst.
|
// Wrap the expression in an AnonConst.
|
||||||
let parent_def_id = self.current_hir_id_owner;
|
let parent_def_id = self.current_hir_id_owner;
|
||||||
let node_id = self.next_node_id();
|
let node_id = self.next_node_id();
|
||||||
self.create_def(parent_def_id.def_id, node_id, DefPathData::AnonConst);
|
self.create_def(
|
||||||
|
parent_def_id.def_id,
|
||||||
|
node_id,
|
||||||
|
DefPathData::AnonConst,
|
||||||
|
*op_sp,
|
||||||
|
);
|
||||||
let anon_const = AnonConst { id: node_id, value: P(expr) };
|
let anon_const = AnonConst { id: node_id, value: P(expr) };
|
||||||
hir::InlineAsmOperand::SymFn {
|
hir::InlineAsmOperand::SymFn {
|
||||||
anon_const: self.lower_anon_const(&anon_const),
|
anon_const: self.lower_anon_const(&anon_const),
|
||||||
|
@ -365,7 +365,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||||||
let node_id = self.next_node_id();
|
let node_id = self.next_node_id();
|
||||||
|
|
||||||
// Add a definition for the in-band const def.
|
// Add a definition for the in-band const def.
|
||||||
self.create_def(parent_def_id.def_id, node_id, DefPathData::AnonConst);
|
self.create_def(parent_def_id.def_id, node_id, DefPathData::AnonConst, f.span);
|
||||||
|
|
||||||
let anon_const = AnonConst { id: node_id, value: arg };
|
let anon_const = AnonConst { id: node_id, value: arg };
|
||||||
generic_args.push(AngleBracketedArg::Arg(GenericArg::Const(anon_const)));
|
generic_args.push(AngleBracketedArg::Arg(GenericArg::Const(anon_const)));
|
||||||
|
@ -487,6 +487,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
parent: LocalDefId,
|
parent: LocalDefId,
|
||||||
node_id: ast::NodeId,
|
node_id: ast::NodeId,
|
||||||
data: DefPathData,
|
data: DefPathData,
|
||||||
|
span: Span,
|
||||||
) -> LocalDefId {
|
) -> LocalDefId {
|
||||||
debug_assert_ne!(node_id, ast::DUMMY_NODE_ID);
|
debug_assert_ne!(node_id, ast::DUMMY_NODE_ID);
|
||||||
assert!(
|
assert!(
|
||||||
@ -497,7 +498,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
self.tcx.hir().def_key(self.local_def_id(node_id)),
|
self.tcx.hir().def_key(self.local_def_id(node_id)),
|
||||||
);
|
);
|
||||||
|
|
||||||
let def_id = self.tcx.create_def(parent, data).def_id();
|
let def_id = self.tcx.at(span).create_def(parent, data).def_id();
|
||||||
|
|
||||||
debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
|
debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
|
||||||
self.resolver.node_id_to_def_id.insert(node_id, def_id);
|
self.resolver.node_id_to_def_id.insert(node_id, def_id);
|
||||||
@ -823,6 +824,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
self.current_hir_id_owner.def_id,
|
self.current_hir_id_owner.def_id,
|
||||||
param,
|
param,
|
||||||
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
|
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
|
||||||
|
ident.span,
|
||||||
);
|
);
|
||||||
debug!(?_def_id);
|
debug!(?_def_id);
|
||||||
|
|
||||||
@ -1151,15 +1153,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
|
|
||||||
let parent_def_id = self.current_hir_id_owner;
|
let parent_def_id = self.current_hir_id_owner;
|
||||||
let node_id = self.next_node_id();
|
let node_id = self.next_node_id();
|
||||||
|
let span = self.lower_span(ty.span);
|
||||||
|
|
||||||
// Add a definition for the in-band const def.
|
// Add a definition for the in-band const def.
|
||||||
let def_id = self.create_def(
|
let def_id = self.create_def(
|
||||||
parent_def_id.def_id,
|
parent_def_id.def_id,
|
||||||
node_id,
|
node_id,
|
||||||
DefPathData::AnonConst,
|
DefPathData::AnonConst,
|
||||||
|
span,
|
||||||
);
|
);
|
||||||
|
|
||||||
let span = self.lower_span(ty.span);
|
|
||||||
let path_expr = Expr {
|
let path_expr = Expr {
|
||||||
id: ty.id,
|
id: ty.id,
|
||||||
kind: ExprKind::Path(qself.clone(), path.clone()),
|
kind: ExprKind::Path(qself.clone(), path.clone()),
|
||||||
@ -1353,12 +1356,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
itctx,
|
itctx,
|
||||||
),
|
),
|
||||||
ImplTraitContext::Universal => {
|
ImplTraitContext::Universal => {
|
||||||
|
let span = t.span;
|
||||||
self.create_def(
|
self.create_def(
|
||||||
self.current_hir_id_owner.def_id,
|
self.current_hir_id_owner.def_id,
|
||||||
*def_node_id,
|
*def_node_id,
|
||||||
DefPathData::ImplTrait,
|
DefPathData::ImplTrait,
|
||||||
|
span,
|
||||||
);
|
);
|
||||||
let span = t.span;
|
|
||||||
let ident = Ident::from_str_and_span(&pprust::ty_to_string(t), span);
|
let ident = Ident::from_str_and_span(&pprust::ty_to_string(t), span);
|
||||||
let (param, bounds, path) =
|
let (param, bounds, path) =
|
||||||
self.lower_generic_and_bounds(*def_node_id, span, ident, bounds);
|
self.lower_generic_and_bounds(*def_node_id, span, ident, bounds);
|
||||||
@ -1455,6 +1459,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
self.current_hir_id_owner.def_id,
|
self.current_hir_id_owner.def_id,
|
||||||
opaque_ty_node_id,
|
opaque_ty_node_id,
|
||||||
DefPathData::ImplTrait,
|
DefPathData::ImplTrait,
|
||||||
|
opaque_ty_span,
|
||||||
);
|
);
|
||||||
debug!(?opaque_ty_def_id);
|
debug!(?opaque_ty_def_id);
|
||||||
|
|
||||||
@ -1608,6 +1613,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
parent_def_id,
|
parent_def_id,
|
||||||
node_id,
|
node_id,
|
||||||
DefPathData::LifetimeNs(lifetime.ident.name),
|
DefPathData::LifetimeNs(lifetime.ident.name),
|
||||||
|
lifetime.ident.span,
|
||||||
);
|
);
|
||||||
remapping.insert(old_def_id, new_def_id);
|
remapping.insert(old_def_id, new_def_id);
|
||||||
|
|
||||||
@ -1624,6 +1630,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
parent_def_id,
|
parent_def_id,
|
||||||
node_id,
|
node_id,
|
||||||
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
|
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
|
||||||
|
lifetime.ident.span,
|
||||||
);
|
);
|
||||||
remapping.insert(old_def_id, new_def_id);
|
remapping.insert(old_def_id, new_def_id);
|
||||||
|
|
||||||
@ -1806,7 +1813,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
let fn_def_id = self.local_def_id(fn_node_id);
|
let fn_def_id = self.local_def_id(fn_node_id);
|
||||||
|
|
||||||
let opaque_ty_def_id =
|
let opaque_ty_def_id =
|
||||||
self.create_def(fn_def_id, opaque_ty_node_id, DefPathData::ImplTrait);
|
self.create_def(fn_def_id, opaque_ty_node_id, DefPathData::ImplTrait, opaque_ty_span);
|
||||||
|
|
||||||
// When we create the opaque type for this async fn, it is going to have
|
// When we create the opaque type for this async fn, it is going to have
|
||||||
// to capture all the lifetimes involved in the signature (including in the
|
// to capture all the lifetimes involved in the signature (including in the
|
||||||
@ -1866,6 +1873,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
opaque_ty_def_id,
|
opaque_ty_def_id,
|
||||||
inner_node_id,
|
inner_node_id,
|
||||||
DefPathData::LifetimeNs(ident.name),
|
DefPathData::LifetimeNs(ident.name),
|
||||||
|
ident.span,
|
||||||
);
|
);
|
||||||
new_remapping.insert(outer_def_id, inner_def_id);
|
new_remapping.insert(outer_def_id, inner_def_id);
|
||||||
|
|
||||||
|
@ -1109,6 +1109,7 @@ rustc_queries! {
|
|||||||
desc { |tcx| "looking up span for `{}`", tcx.def_path_str(def_id) }
|
desc { |tcx| "looking up span for `{}`", tcx.def_path_str(def_id) }
|
||||||
cache_on_disk_if { def_id.is_local() }
|
cache_on_disk_if { def_id.is_local() }
|
||||||
separate_provide_extern
|
separate_provide_extern
|
||||||
|
feedable
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the span for the identifier of the definition.
|
/// Gets the span for the identifier of the definition.
|
||||||
|
@ -1507,7 +1507,9 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
self.def_path(def_id).to_string_no_crate_verbose()
|
self.def_path(def_id).to_string_no_crate_verbose()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TyCtxtAt<'tcx> {
|
||||||
/// Create a new definition within the incr. comp. engine.
|
/// Create a new definition within the incr. comp. engine.
|
||||||
pub fn create_def(
|
pub fn create_def(
|
||||||
self,
|
self,
|
||||||
@ -1536,9 +1538,13 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
// - this write will have happened before these queries are called.
|
// - this write will have happened before these queries are called.
|
||||||
let def_id = self.definitions.write().create_def(parent, data);
|
let def_id = self.definitions.write().create_def(parent, data);
|
||||||
|
|
||||||
TyCtxtFeed { tcx: self, def_id }
|
let feed = TyCtxtFeed { tcx: self.tcx, def_id };
|
||||||
|
feed.def_span(self.span);
|
||||||
|
feed
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TyCtxt<'tcx> {
|
||||||
pub fn iter_local_def_id(self) -> impl Iterator<Item = LocalDefId> + 'tcx {
|
pub fn iter_local_def_id(self) -> impl Iterator<Item = LocalDefId> + 'tcx {
|
||||||
// Create a dependency to the red node to be sure we re-execute this when the amount of
|
// Create a dependency to the red node to be sure we re-execute this when the amount of
|
||||||
// definitions change.
|
// definitions change.
|
||||||
|
@ -532,7 +532,8 @@ impl<K: DepKind> DepGraph<K> {
|
|||||||
let mut edges = SmallVec::new();
|
let mut edges = SmallVec::new();
|
||||||
K::read_deps(|task_deps| match task_deps {
|
K::read_deps(|task_deps| match task_deps {
|
||||||
TaskDepsRef::Allow(deps) => edges.extend(deps.lock().reads.iter().copied()),
|
TaskDepsRef::Allow(deps) => edges.extend(deps.lock().reads.iter().copied()),
|
||||||
TaskDepsRef::Ignore | TaskDepsRef::Forbid => {
|
TaskDepsRef::Ignore => {} // During HIR lowering, we have no dependencies.
|
||||||
|
TaskDepsRef::Forbid => {
|
||||||
panic!("Cannot summarize when dependencies are not recorded.")
|
panic!("Cannot summarize when dependencies are not recorded.")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user