Skip to content

Commit 1c4dcf4

Browse files
committed
fix(query): Pass query key to value_from_cycle_error
1 parent b2fabe3 commit 1c4dcf4

4 files changed

Lines changed: 28 additions & 24 deletions

File tree

compiler/rustc_middle/src/query/plumbing.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,12 @@ pub struct QueryVTable<'tcx, C: QueryCache> {
138138
/// For `no_hash` queries, this function pointer is None.
139139
pub hash_value_fn: Option<fn(&mut StableHashingContext<'_>, &C::Value) -> Fingerprint>,
140140

141-
pub value_from_cycle_error:
142-
fn(tcx: TyCtxt<'tcx>, cycle_error: CycleError, guar: ErrorGuaranteed) -> C::Value,
141+
pub value_from_cycle_error: fn(
142+
tcx: TyCtxt<'tcx>,
143+
key: C::Key,
144+
cycle_error: CycleError,
145+
guar: ErrorGuaranteed,
146+
) -> C::Value,
143147
pub format_value: fn(&C::Value) -> String,
144148

145149
/// Formats a human-readable description of this query and its key, as

compiler/rustc_query_impl/src/execution.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,18 @@ where
9898
fn mk_cycle<'tcx, C: QueryCache>(
9999
query: &'tcx QueryVTable<'tcx, C>,
100100
tcx: TyCtxt<'tcx>,
101+
key: C::Key,
101102
cycle_error: CycleError,
102103
) -> C::Value {
103104
let error = report_cycle(tcx.sess, &cycle_error);
104105
match query.cycle_error_handling {
105106
CycleErrorHandling::Error => {
106107
let guar = error.emit();
107-
(query.value_from_cycle_error)(tcx, cycle_error, guar)
108+
(query.value_from_cycle_error)(tcx, key, cycle_error, guar)
108109
}
109110
CycleErrorHandling::DelayBug => {
110111
let guar = error.delay_as_bug();
111-
(query.value_from_cycle_error)(tcx, cycle_error, guar)
112+
(query.value_from_cycle_error)(tcx, key, cycle_error, guar)
112113
}
113114
CycleErrorHandling::Stash => {
114115
let guar = if let Some(root) = cycle_error.cycle.first()
@@ -118,7 +119,7 @@ fn mk_cycle<'tcx, C: QueryCache>(
118119
} else {
119120
error.emit()
120121
};
121-
(query.value_from_cycle_error)(tcx, cycle_error, guar)
122+
(query.value_from_cycle_error)(tcx, key, cycle_error, guar)
122123
}
123124
}
124125
}
@@ -202,6 +203,7 @@ where
202203
fn cycle_error<'tcx, C: QueryCache>(
203204
query: &'tcx QueryVTable<'tcx, C>,
204205
tcx: TyCtxt<'tcx>,
206+
key: C::Key,
205207
try_execute: QueryJobId,
206208
span: Span,
207209
) -> (C::Value, Option<DepNodeIndex>) {
@@ -212,7 +214,7 @@ fn cycle_error<'tcx, C: QueryCache>(
212214
.expect("failed to collect active queries");
213215

214216
let error = find_cycle_in_stack(try_execute, job_map, &current_query_job(), span);
215-
(mk_cycle(query, tcx, error.lift()), None)
217+
(mk_cycle(query, tcx, key, error.lift()), None)
216218
}
217219

218220
#[inline(always)]
@@ -257,7 +259,7 @@ fn wait_for_query<'tcx, C: QueryCache>(
257259

258260
(v, Some(index))
259261
}
260-
Err(cycle) => (mk_cycle(query, tcx, cycle.lift()), None),
262+
Err(cycle) => (mk_cycle(query, tcx, key, cycle.lift()), None),
261263
}
262264
}
263265

@@ -320,7 +322,7 @@ fn try_execute_query<'tcx, C: QueryCache, const INCR: bool>(
320322

321323
// If we are single-threaded we know that we have cycle error,
322324
// so we just return the error.
323-
cycle_error(query, tcx, id, span)
325+
cycle_error(query, tcx, key, id, span)
324326
}
325327
}
326328
ActiveKeyStatus::Poisoned => FatalError.raise(),

compiler/rustc_query_impl/src/from_cycle_error.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,37 +16,38 @@ use rustc_middle::query::plumbing::CyclePlaceholder;
1616
use rustc_middle::ty::layout::{LayoutError, TyAndLayout};
1717
use rustc_middle::ty::{self, Ty, TyCtxt};
1818
use rustc_middle::{bug, span_bug};
19-
use rustc_span::def_id::LocalDefId;
19+
use rustc_span::def_id::{DefId, LocalDefId};
2020
use rustc_span::{ErrorGuaranteed, Span};
2121

2222
use crate::job::report_cycle;
2323

2424
pub(crate) fn specialize_query_vtables<'tcx>(vtables: &mut QueryVTables<'tcx>) {
2525
vtables.type_of.value_from_cycle_error =
26-
|tcx, _, guar| erase_val(ty::EarlyBinder::bind(Ty::new_error(tcx, guar)));
26+
|tcx, _, _, guar| erase_val(ty::EarlyBinder::bind(Ty::new_error(tcx, guar)));
2727

2828
vtables.type_of_opaque_hir_typeck.value_from_cycle_error =
29-
|tcx, _, guar| erase_val(ty::EarlyBinder::bind(Ty::new_error(tcx, guar)));
29+
|tcx, _, _, guar| erase_val(ty::EarlyBinder::bind(Ty::new_error(tcx, guar)));
3030

3131
vtables.erase_and_anonymize_regions_ty.value_from_cycle_error =
32-
|tcx, _, guar| erase_val(Ty::new_error(tcx, guar));
32+
|tcx, _, _, guar| erase_val(Ty::new_error(tcx, guar));
3333

3434
vtables.type_of_opaque.value_from_cycle_error =
35-
|_, _, guar| erase_val(Err(CyclePlaceholder(guar)));
35+
|_, _, _, guar| erase_val(Err(CyclePlaceholder(guar)));
3636

37-
vtables.fn_sig.value_from_cycle_error = |tcx, cycle, guar| erase_val(fn_sig(tcx, cycle, guar));
37+
vtables.fn_sig.value_from_cycle_error =
38+
|tcx, key, _cycle, guar| erase_val(fn_sig(tcx, key, guar));
3839

3940
vtables.check_representability.value_from_cycle_error =
40-
|tcx, cycle, guar| check_representability(tcx, cycle, guar);
41+
|tcx, _key, cycle, guar| check_representability(tcx, cycle, guar);
4142

4243
vtables.check_representability_adt_ty.value_from_cycle_error =
43-
|tcx, cycle, guar| check_representability(tcx, cycle, guar);
44+
|tcx, _key, cycle, guar| check_representability(tcx, cycle, guar);
4445

4546
vtables.variances_of.value_from_cycle_error =
46-
|tcx, cycle, guar| erase_val(variances_of(tcx, cycle, guar));
47+
|tcx, _key, cycle, guar| erase_val(variances_of(tcx, cycle, guar));
4748

4849
vtables.layout_of.value_from_cycle_error =
49-
|tcx, cycle, guar| erase_val(layout_of(tcx, cycle, guar));
50+
|tcx, _key, cycle, guar| erase_val(layout_of(tcx, cycle, guar));
5051
}
5152

5253
pub(crate) fn default<'tcx>(tcx: TyCtxt<'tcx>, cycle_error: CycleError, query_name: &str) -> ! {
@@ -61,15 +62,12 @@ pub(crate) fn default<'tcx>(tcx: TyCtxt<'tcx>, cycle_error: CycleError, query_na
6162

6263
fn fn_sig<'tcx>(
6364
tcx: TyCtxt<'tcx>,
64-
cycle_error: CycleError,
65+
def_id: DefId,
6566
guar: ErrorGuaranteed,
6667
) -> ty::EarlyBinder<'tcx, ty::PolyFnSig<'tcx>> {
6768
let err = Ty::new_error(tcx, guar);
6869

69-
let arity = if let Some(info) = cycle_error.cycle.get(0)
70-
&& info.frame.dep_kind == DepKind::fn_sig
71-
&& let Some(def_id) = info.frame.def_id
72-
&& let Some(node) = tcx.hir_get_if_local(def_id)
70+
let arity = if let Some(node) = tcx.hir_get_if_local(def_id)
7371
&& let Some(sig) = node.fn_sig()
7472
{
7573
sig.decl.inputs.len()

compiler/rustc_query_impl/src/plumbing.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ macro_rules! define_queries {
467467
#[cfg(not($cache_on_disk))]
468468
is_loadable_from_disk_fn: |_tcx, _key, _index| false,
469469

470-
value_from_cycle_error: |tcx, cycle, _| {
470+
value_from_cycle_error: |tcx, _key, cycle, _| {
471471
$crate::from_cycle_error::default(tcx, cycle, stringify!($name))
472472
},
473473

0 commit comments

Comments
 (0)