Skip to content

Commit 9e62a0a

Browse files
committed
Disable fallbacks for queries marked with fatal_cycle
1 parent 35975c0 commit 9e62a0a

4 files changed

Lines changed: 57 additions & 377 deletions

File tree

compiler/rustc_middle/src/query/plumbing.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ impl<'tcx> TyCtxt<'tcx> {
174174
}
175175
}
176176

177+
/// For cases when fallback query is unused (aka marked with `fatal_cycle`) makes it impossible to
178+
/// assign `providers.fallback_queries.<name>` a function to avoid possible confusion.
179+
#[derive(Clone, Copy)]
180+
pub struct DisabledWithFatalCycle;
181+
177182
/// Calls either `query_ensure` or `query_ensure_error_guaranteed`, depending
178183
/// on whether the list of modifiers contains `return_result_from_ensure_ok`.
179184
macro_rules! query_ensure_select {
@@ -455,12 +460,14 @@ macro_rules! define_callbacks {
455460
}
456461

457462
pub struct FallbackProviders {
458-
$(pub $name: for<'tcx> fn(
459-
TyCtxt<'tcx>,
460-
queries::$name::LocalKey<'tcx>,
461-
cycle: &$crate::query::plumbing::CycleError,
462-
guar: $crate::query::plumbing::ErrorGuaranteed,
463-
) -> queries::$name::ProvidedValue<'tcx>,)*
463+
$(pub $name: disable_on_fatal_cycle!([$($modifiers)*]{
464+
for<'tcx> fn(
465+
TyCtxt<'tcx>,
466+
queries::$name::LocalKey<'tcx>,
467+
cycle: &$crate::query::plumbing::CycleError,
468+
guar: $crate::query::plumbing::ErrorGuaranteed,
469+
) -> queries::$name::ProvidedValue<'tcx>
470+
}),)*
464471
}
465472

466473
impl Default for Providers {
@@ -482,7 +489,11 @@ macro_rules! define_callbacks {
482489
impl Default for FallbackProviders {
483490
fn default() -> Self {
484491
FallbackProviders {
485-
$($name: |tcx, key, cycle, guar| $crate::query::plumbing::default_fallback_query(tcx, stringify!($name), &key, cycle, guar)),*
492+
$($name: disable_on_fatal_cycle!([$($modifiers)*]{
493+
|tcx, key, cycle, guar| {
494+
$crate::query::plumbing::default_fallback_query(tcx, stringify!($name), &key, cycle, guar)
495+
}
496+
})),*
486497
}
487498
}
488499
}
@@ -526,6 +537,18 @@ macro_rules! hash_result {
526537
};
527538
}
528539

540+
macro_rules! disable_on_fatal_cycle {
541+
([]{$($code:tt)*}) => {
542+
$($code)*
543+
};
544+
([(fatal_cycle) $($rest:tt)*]{$($code:tt)*}) => {
545+
$crate::query::plumbing::DisabledWithFatalCycle
546+
};
547+
([$other:tt $($modifiers:tt)*]{$($code:tt)*}) => {
548+
disable_on_fatal_cycle!([$($modifiers)*]{$($code)*})
549+
};
550+
}
551+
529552
macro_rules! define_feedable {
530553
($($(#[$attr:meta])* [$($modifiers:tt)*] fn $name:ident($($K:tt)*) -> $V:ty,)*) => {
531554
$(impl<'tcx, K: IntoQueryParam<$($K)*> + Copy> TyCtxtFeed<'tcx, K> {

0 commit comments

Comments
 (0)