@@ -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`.
179184macro_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+
529552macro_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