Skip to content

Commit 95308ca

Browse files
committed
Don't hang forever if a query cycle occurs in def_span
WIP: desc ``` rustc_query_impl::execution::try_execute_query query="lower_delayed_owner" rustc_query_impl::execution::try_execute_query query="local_def_id_to_hir_id" rustc_query_impl::execution::try_execute_query query="hir_attr_map" rustc_query_impl::execution::try_execute_query query="associated_item" rustc_query_impl::execution::try_execute_query query="opt_hir_owner_nodes" rustc_query_impl::execution::try_execute_query query="fn_arg_idents" rustc_query_impl::execution::try_execute_query query="fn_sig" rustc_query_impl::execution::try_execute_query query="late_bound_vars_map" rustc_query_impl::execution::try_execute_query query="resolve_bound_vars" rustc_query_impl::execution::try_execute_query query="generics_of" rustc_query_impl::execution::try_execute_query query="local_def_id_to_hir_id" rustc_query_impl::execution::try_execute_query query="opt_hir_owner_nodes" rustc_query_impl::execution::try_execute_query query="generics_of" rustc_query_impl::execution::try_execute_query query="asyncness" rustc_query_impl::execution::try_execute_query query="codegen_fn_attrs" rustc_query_impl::execution::try_execute_query query="hir_crate_items" 0ms INFO rustc_query_impl::execution hit a query cycle evaluating hir_crate_items! rustc_middle::queries::default_span self=hir_crate_items(()) rustc_middle::queries::default_span self=lower_delayed_owner(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_query_impl::execution::try_execute_query query="def_span" rustc_query_impl::execution::try_execute_query query="local_def_id_to_hir_id" rustc_query_impl::execution::try_execute_query query="lower_delayed_owner" 0ms INFO rustc_query_impl::execution hit a query cycle evaluating lower_delayed_owner! rustc_middle::queries::default_span self=lower_delayed_owner(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_query_impl::execution::try_execute_query query="def_span" 0ms INFO rustc_query_impl::execution hit a query cycle evaluating def_span! rustc_middle::queries::default_span self=def_span(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_query_impl::execution::try_execute_query query="def_span" rustc_query_impl::execution::try_execute_query query="local_def_id_to_hir_id" rustc_query_impl::execution::try_execute_query query="opt_hir_owner_nodes" rustc_middle::queries::default_span self=local_def_id_to_hir_id(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_middle::queries::default_span self=codegen_fn_attrs(DefId(0:5 ~ bad_resolve[0a7b]::Trait::bar)) rustc_query_impl::execution::try_execute_query query="def_span" error[E0391]: cycle detected when looking up span for `<impl at bad-resolve.rs:15:1: 15:17>::bar` | = note: ...which requires getting HIR ID of `<impl at bad-resolve.rs:15:1: 15:17>::bar`... = note: ...which again requires looking up span for `<impl at bad-resolve.rs:15:1: 15:17>::bar`, completing the cycle note: cycle used when computing codegen attributes of `Trait::bar` --> bad-resolve.rs:6:5 | 6 | fn bar() {} | ^^^^^^^^ ```
1 parent 4d128c0 commit 95308ca

2 files changed

Lines changed: 4 additions & 1 deletion

File tree

compiler/rustc_middle/src/hir/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,9 @@ pub fn provide(providers: &mut Providers) {
485485
};
486486
providers.opt_ast_lowering_delayed_lints =
487487
|tcx, id| tcx.hir_crate(()).owner(tcx, id.def_id).as_owner().map(|o| &o.delayed_lints);
488+
// WARNING: this provider is used in `create_query_cycle` to detect the span where a cycle
489+
// occurred. You *must* update `rustc_middle::query::plumbing::TaggedQueryKey::default_span` if
490+
// you update this implementation to use additional queries.
488491
providers.def_span = |tcx, def_id| tcx.hir_span(tcx.local_def_id_to_hir_id(def_id));
489492
providers.def_ident_span = |tcx, def_id| {
490493
let hir_id = tcx.local_def_id_to_hir_id(def_id);

compiler/rustc_middle/src/query/plumbing.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ macro_rules! define_callbacks {
437437
if !span.is_dummy() {
438438
return span
439439
}
440-
if let TaggedQueryKey::def_span(..) = self {
440+
if let TaggedQueryKey::def_span(..) | TaggedQueryKey::local_def_id_to_hir_id(..) = self {
441441
// The `def_span` query is used to calculate `default_span`,
442442
// so exit to avoid infinite recursion.
443443
return DUMMY_SP

0 commit comments

Comments
 (0)