Skip to main content

rustc_query_impl/
plumbing.rs

1//! The implementation of the query system itself. This defines the macros that
2//! generate the actual methods on tcx which find and execute the provider,
3//! manage the caches, and so forth.
4
5use std::num::NonZero;
6
7use rustc_data_structures::sync::{DynSend, DynSync};
8use rustc_data_structures::unord::UnordMap;
9use rustc_hir::def_id::DefId;
10use rustc_hir::limit::Limit;
11use rustc_index::Idx;
12use rustc_middle::bug;
13#[expect(unused_imports, reason = "used by doc comments")]
14use rustc_middle::dep_graph::DepKindVTable;
15use rustc_middle::dep_graph::{DepKind, DepNode, DepNodeIndex, DepNodeKey, SerializedDepNodeIndex};
16use rustc_middle::query::erase::{Erasable, Erased};
17use rustc_middle::query::on_disk_cache::{
18    AbsoluteBytePos, CacheDecoder, CacheEncoder, EncodedDepNodeIndex,
19};
20use rustc_middle::query::plumbing::QueryVTable;
21use rustc_middle::query::{
22    QueryCache, QueryJobId, QueryKey, QueryMode, QueryStackDeferred, QueryStackFrame,
23    QueryStackFrameExtra, erase,
24};
25use rustc_middle::ty::codec::TyEncoder;
26use rustc_middle::ty::print::with_reduced_queries;
27use rustc_middle::ty::tls::{self, ImplicitCtxt};
28use rustc_middle::ty::{self, TyCtxt};
29use rustc_serialize::{Decodable, Encodable};
30use rustc_span::DUMMY_SP;
31use rustc_span::def_id::LOCAL_CRATE;
32
33use crate::error::{QueryOverflow, QueryOverflowNote};
34use crate::execution::{all_inactive, force_query};
35use crate::job::find_dep_kind_root;
36use crate::{GetQueryVTable, collect_active_jobs_from_all_queries, for_each_query_vtable};
37
38fn depth_limit_error<'tcx>(tcx: TyCtxt<'tcx>, job: QueryJobId) {
39    let job_map =
40        collect_active_jobs_from_all_queries(tcx, true).expect("failed to collect active queries");
41    let (info, depth) = find_dep_kind_root(job, job_map);
42
43    let suggested_limit = match tcx.recursion_limit() {
44        Limit(0) => Limit(2),
45        limit => limit * 2,
46    };
47
48    tcx.sess.dcx().emit_fatal(QueryOverflow {
49        span: info.job.span,
50        note: QueryOverflowNote { desc: info.frame.info.extract().description, depth },
51        suggested_limit,
52        crate_name: tcx.crate_name(LOCAL_CRATE),
53    });
54}
55
56#[inline]
57pub(crate) fn next_job_id<'tcx>(tcx: TyCtxt<'tcx>) -> QueryJobId {
58    QueryJobId(
59        NonZero::new(tcx.query_system.jobs.fetch_add(1, std::sync::atomic::Ordering::Relaxed))
60            .unwrap(),
61    )
62}
63
64#[inline]
65pub(crate) fn current_query_job() -> Option<QueryJobId> {
66    tls::with_context(|icx| icx.query)
67}
68
69/// Executes a job by changing the `ImplicitCtxt` to point to the new query job while it executes.
70#[inline(always)]
71pub(crate) fn start_query<R>(
72    job_id: QueryJobId,
73    depth_limit: bool,
74    compute: impl FnOnce() -> R,
75) -> R {
76    tls::with_context(move |icx| {
77        if depth_limit && !icx.tcx.recursion_limit().value_within_limit(icx.query_depth) {
78            depth_limit_error(icx.tcx, job_id);
79        }
80
81        // Update the `ImplicitCtxt` to point to our new query job.
82        let icx = ImplicitCtxt {
83            query: Some(job_id),
84            query_depth: icx.query_depth + if depth_limit { 1 } else { 0 },
85            ..*icx
86        };
87
88        // Use the `ImplicitCtxt` while we execute the query.
89        tls::enter_context(&icx, compute)
90    })
91}
92
93/// The deferred part of a deferred query stack frame.
94fn mk_query_stack_frame_extra<'tcx, Cache>(
95    (tcx, vtable, key): (TyCtxt<'tcx>, &'tcx QueryVTable<'tcx, Cache>, Cache::Key),
96) -> QueryStackFrameExtra
97where
98    Cache: QueryCache,
99    Cache::Key: QueryKey,
100{
101    let def_id = key.key_as_def_id();
102
103    // If reduced queries are requested, we may be printing a query stack due
104    // to a panic. Avoid using `default_span` and `def_kind` in that case.
105    let reduce_queries = with_reduced_queries();
106
107    // Avoid calling queries while formatting the description
108    let description = {
    {
        let _guard = ReducedQueriesGuard::new();
        {
            let _guard = ForcedImplGuard::new();
            {
                let _guard = NoTrimmedGuard::new();
                {
                    let _guard = NoVisibleGuard::new();
                    (vtable.description_fn)(tcx, key)
                }
            }
        }
    }
}ty::print::with_no_queries!((vtable.description_fn)(tcx, key));
109    let description = if tcx.sess.verbose_internals() {
110        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{1} [{0:?}]", vtable.name,
                description))
    })format!("{description} [{name:?}]", name = vtable.name)
111    } else {
112        description
113    };
114    let span = if vtable.dep_kind == DepKind::def_span || reduce_queries {
115        // The `def_span` query is used to calculate `default_span`,
116        // so exit to avoid infinite recursion.
117        None
118    } else {
119        Some(key.default_span(tcx))
120    };
121
122    let def_kind = if vtable.dep_kind == DepKind::def_kind || reduce_queries {
123        // Try to avoid infinite recursion.
124        None
125    } else {
126        def_id.and_then(|def_id| def_id.as_local()).map(|def_id| tcx.def_kind(def_id))
127    };
128    QueryStackFrameExtra::new(description, span, def_kind)
129}
130
131pub(crate) fn create_deferred_query_stack_frame<'tcx, C>(
132    tcx: TyCtxt<'tcx>,
133    vtable: &'tcx QueryVTable<'tcx, C>,
134    key: C::Key,
135) -> QueryStackFrame<QueryStackDeferred<'tcx>>
136where
137    C: QueryCache<Key: QueryKey + DynSend + DynSync>,
138    QueryVTable<'tcx, C>: DynSync,
139{
140    let kind = vtable.dep_kind;
141
142    let def_id: Option<DefId> = key.key_as_def_id();
143    let def_id_for_ty_in_cycle: Option<DefId> = key.def_id_for_ty_in_cycle();
144
145    let info = QueryStackDeferred::new((tcx, vtable, key), mk_query_stack_frame_extra);
146    QueryStackFrame::new(info, kind, def_id, def_id_for_ty_in_cycle)
147}
148
149pub(crate) fn encode_all_query_results<'tcx>(
150    tcx: TyCtxt<'tcx>,
151    encoder: &mut CacheEncoder<'_, 'tcx>,
152    query_result_index: &mut EncodedDepNodeIndex,
153) {
154    {
    let tcx: rustc_middle::ty::TyCtxt<'_> = tcx;
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.derive_macro_expansion;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.hir_module_items;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.const_param_default;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.const_of_item;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.type_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.collect_return_position_impl_trait_in_trait_tys;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.generics_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.explicit_item_bounds;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.explicit_item_self_bounds;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.mir_const_qualif;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.mir_for_ctfe;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.mir_coroutine_witnesses;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.optimized_mir;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.promoted_mir;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.explicit_predicates_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.inferred_outlives_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.explicit_super_predicates_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.explicit_implied_predicates_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.trait_def;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.adt_def;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.adt_destructor;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.adt_async_destructor;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.variances_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.associated_item_def_ids;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.associated_item;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.impl_trait_header;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.inherent_impls;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.fn_sig;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.check_liveness;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.coerce_unsized_info;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.typeck;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.used_trait_imports;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.mir_callgraph_cyclic;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.eval_to_allocation_raw;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.eval_static_initializer;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.eval_to_const_value_raw;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.reachable_set;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.symbol_name;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.def_kind;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.def_span;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.def_ident_span;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.ty_span;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.lookup_stability;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.lookup_const_stability;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.lookup_deprecation_entry;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.codegen_fn_attrs;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.is_mir_available;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.codegen_select_candidate;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.specialization_graph_of;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.adt_drop_tys;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.adt_async_drop_tys;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.has_ffi_unwind_calls;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.is_reachable_non_generic;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.exported_non_generic_symbols;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.exported_generic_symbols;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.items_of_instance;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.size_estimate;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.trivial_const;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
    {
        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
            &tcx.query_system.query_vtables.externally_implementable_items;
        (|query|
                {
                    encode_query_results(tcx, query, encoder,
                        query_result_index)
                })(query);
    }
};for_each_query_vtable!(CACHE_ON_DISK, tcx, |query| {
155        encode_query_results(tcx, query, encoder, query_result_index)
156    });
157}
158
159fn encode_query_results<'a, 'tcx, C, V>(
160    tcx: TyCtxt<'tcx>,
161    query: &'tcx QueryVTable<'tcx, C>,
162    encoder: &mut CacheEncoder<'a, 'tcx>,
163    query_result_index: &mut EncodedDepNodeIndex,
164) where
165    C: QueryCache<Value = Erased<V>>,
166    V: Erasable + Encodable<CacheEncoder<'a, 'tcx>>,
167{
168    let _timer = tcx.prof.generic_activity_with_arg("encode_query_results_for", query.name);
169
170    if !all_inactive(&query.state) {
    ::core::panicking::panic("assertion failed: all_inactive(&query.state)")
};assert!(all_inactive(&query.state));
171    query.cache.for_each(&mut |key, value, dep_node| {
172        if (query.will_cache_on_disk_for_key_fn)(tcx, *key) {
173            let dep_node = SerializedDepNodeIndex::new(dep_node.index());
174
175            // Record position of the cache entry.
176            query_result_index.push((dep_node, AbsoluteBytePos::new(encoder.position())));
177
178            // Encode the type check tables with the `SerializedDepNodeIndex`
179            // as tag.
180            encoder.encode_tagged(dep_node, &erase::restore_val::<V>(*value));
181        }
182    });
183}
184
185pub(crate) fn query_key_hash_verify_all<'tcx>(tcx: TyCtxt<'tcx>) {
186    if tcx.sess.opts.unstable_opts.incremental_verify_ich || truecfg!(debug_assertions) {
187        tcx.sess.time("query_key_hash_verify_all", || {
188            {
    let tcx: rustc_middle::ty::TyCtxt<'_> = tcx;
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.derive_macro_expansion;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trigger_delayed_bug;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.registered_tools;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.early_lint_checks;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.env_var_os;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolutions;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolver_for_lowering_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.source_span;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_crate;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_crate_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_module_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.local_def_id_to_hir_id;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_owner_parent_q;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opt_hir_owner_nodes;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_attr_map;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opt_ast_lowering_delayed_lints;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.const_param_default;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.const_of_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_of_opaque;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_of_opaque_hir_typeck;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_alias_is_lazy;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.collect_return_position_impl_trait_in_trait_tys;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opaque_ty_origin;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.unsizing_params_for_adt;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.analysis;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_expectations;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.generics_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.predicates_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opaque_types_defined_by;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.nested_bodies_within;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_item_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_item_self_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.item_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.item_self_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.item_non_self_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_super_outlives;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.native_libraries;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.shallow_lint_levels_on;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lint_expectations;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lints_that_dont_need_to_run;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.expn_that_defined;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_panic_runtime;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_representability;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_representability_adt_ty;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.params_in_repr;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.thir_body;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_keys;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_const_qualif;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_built;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.thir_abstract_const;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_drops_elaborated_and_const_checked;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_for_ctfe;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_promoted;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.closure_typeinfo;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.closure_saved_names_of_captured_variables;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_coroutine_witnesses;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_coroutine_obligations;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_potentially_region_dependent_goals;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.optimized_mir;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coverage_attr_on;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coverage_ids_info;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.promoted_mir;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.erase_and_anonymize_regions_ty;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.wasm_import_module_map;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_explicit_predicates_and_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_predicates_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inferred_outlives_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_super_predicates_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_implied_predicates_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_supertraits_containing_assoc_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.const_conditions;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_implied_const_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_param_predicates;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_def;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_def;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_destructor;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_async_destructor;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_sizedness_constraint;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_dtorck_constraint;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.constness;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.asyncness;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_promotable_const_fn;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_by_move_body_def_id;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_kind;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_for_closure;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_hidden_types;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_variances;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.variances_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inferred_outlives_crate;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_item_def_ids;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_item_implementor_ids;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_types_for_impl_traits_in_trait_or_impl;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_trait_header;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_self_is_guaranteed_unsized;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inherent_impls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.incoherent_impls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_transmutes;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_unsafety;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_tail_calls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.assumed_wf_types;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.assumed_wf_types_for_rpitit;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_sig;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lint_mod;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_unused_traits;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_attrs;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_unstable_api_usage;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_privacy;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_liveness;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.live_symbols_and_ignored_derived_traits;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_deathness;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_type_wf;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coerce_unsized_info;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.typeck;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.used_trait_imports;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coherent_trait;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_borrowck;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_inherent_impls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_inherent_impls_validity_check;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_inherent_impls_overlap_check;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.orphan_check_impl;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_callgraph_cyclic;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_inliner_callees;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.tag_for_variant;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_to_allocation_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_static_initializer;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_to_const_value_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_to_valtree;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.valtree_to_const_val;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lit_to_const;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_match;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.effective_visibilities;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_private_in_public;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.reachable_set;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.region_scope_tree;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_shims;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.symbol_name;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.def_kind;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.def_span;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.def_ident_span;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.ty_span;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_stability;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_const_stability;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_default_body_stability;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.should_inherit_track_caller;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inherited_align;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_deprecation_entry;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_doc_hidden;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_doc_notable_trait;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.attrs_for_def;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.codegen_fn_attrs;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.asm_target_features;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_arg_idents;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.rendered_const;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.rendered_precise_capturing_args;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_parent;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_mir_available;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.own_existential_vtable_entries;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.vtable_entries;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.first_method_vtable_slot;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.supertrait_vtable_slot;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.vtable_allocation;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.codegen_select_candidate;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.all_local_trait_impls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.local_trait_impls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_impls_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.specialization_graph_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dyn_compatibility_violations;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_dyn_compatible;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.param_env;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.typing_env_normalized_for_post_analysis;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_copy_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_use_cloned_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_sized_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_freeze_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_unsafe_unpin_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_unpin_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_async_drop_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.needs_drop_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.needs_async_drop_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_significant_drop_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_structural_eq_impl;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_drop_tys;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_async_drop_tys;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_significant_drop_tys;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.list_significant_drop_tys;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.layout_of;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_abi_of_fn_ptr;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_abi_of_instance_no_deduced_attrs;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_abi_of_instance_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dylib_dependency_formats;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dependency_formats;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_compiler_builtins;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_global_allocator;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_alloc_error_handler;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_panic_handler;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_profiler_runtime;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_ffi_unwind_calls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.required_panic_strategy;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.panic_in_drop_strategy;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_no_builtins;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.symbol_mangling_version;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.extern_crate;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.specialization_enabled_in;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.specializes;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.in_scope_traits_map;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.defaultness;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.default_field;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_well_formed;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.enforce_impl_non_lifetime_params_are_constrained;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.reachable_non_generics;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_reachable_non_generic;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_unreachable_local_definition;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_monomorphizations;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_monomorphizations_for;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_drop_glue_for;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_async_drop_glue_for;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.foreign_modules;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.clashing_extern_declarations;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.entry_fn;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.proc_macro_decls_static;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_hash;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_host_hash;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.extra_filename;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_extern_paths;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.implementations_of_trait;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_incoherent_impls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.native_library;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inherit_sig_for_delegation_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolve_bound_vars;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.named_variable_map;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_late_bound_map;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.object_lifetime_default;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.late_bound_vars_map;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opaque_captured_lifetimes;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.visibility;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inhabited_predicate_adt;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inhabited_predicate_type;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_dep_kind;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_name;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.module_children;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.num_extern_def_ids;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lib_features;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.stability_implications;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.intrinsic_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.get_lang_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.all_diagnostic_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.defined_lang_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.diagnostic_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.missing_lang_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.visible_parent_map;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trimmed_def_paths;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.missing_extern_crate_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.used_crate_source;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.debugger_visualizers;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.postorder_cnums;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_private_dep;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.allocator_kind;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.alloc_error_handler_kind;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upvars_mentioned;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crates;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.used_crates;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.duplicate_crate_names;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.traits;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_impls_in_crate;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.stable_order_of_exportable_impls;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.exportable_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.exported_non_generic_symbols;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.exported_generic_symbols;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.collect_and_partition_mono_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_codegened_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.codegen_unit;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.backend_optimization_level;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.output_filenames;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.normalize_canonicalized_projection;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.normalize_canonicalized_free_alias;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.normalize_canonicalized_inherent_projection;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.try_normalize_generic_arg_after_erasing_regions;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.implied_outlives_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dropck_outlives;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.evaluate_obligation;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_ascribe_user_type;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_prove_predicate;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_ty;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_clause;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_poly_fn_sig;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_fn_sig;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.instantiate_and_check_impossible_predicates;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_impossible_associated_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.method_autoderef_steps;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.evaluate_root_goal_for_proof_tree_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.rust_target_features;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.implied_target_features;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.features_query;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_for_resolver;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolve_instance_raw;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.reveal_opaque_types_in_bounds;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.limits;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.diagnostic_hir_wf_check;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.global_backend_features;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_validity_requirement;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.compare_impl_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.deduced_param_attrs;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.doc_link_resolutions;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.doc_link_traits_in_scope;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.stripped_cfg_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.generics_require_sized_self;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.cross_crate_inlinable;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mono_item;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.skip_move_check_fns;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.items_of_instance;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.size_estimate;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.anon_const_kind;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trivial_const;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.sanitizer_settings_for;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_externally_implementable_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.externally_implementable_items;
    (|query| { query_key_hash_verify(query, tcx); })(query);
};for_each_query_vtable!(ALL, tcx, |query| {
189                query_key_hash_verify(query, tcx);
190            });
191        });
192    }
193}
194
195fn query_key_hash_verify<'tcx, C: QueryCache>(
196    query: &'tcx QueryVTable<'tcx, C>,
197    tcx: TyCtxt<'tcx>,
198) {
199    let _timer = tcx.prof.generic_activity_with_arg("query_key_hash_verify_for", query.name);
200
201    let cache = &query.cache;
202    let mut map = UnordMap::with_capacity(cache.len());
203    cache.for_each(&mut |key, _, _| {
204        let node = DepNode::construct(tcx, query.dep_kind, key);
205        if let Some(other_key) = map.insert(node, *key) {
206            ::rustc_middle::util::bug::bug_fmt(format_args!("query key:\n`{0:?}`\nand key:\n`{1:?}`\nmapped to the same dep node:\n{2:?}",
        key, other_key, node));bug!(
207                "query key:\n\
208                `{:?}`\n\
209                and key:\n\
210                `{:?}`\n\
211                mapped to the same dep node:\n\
212                {:?}",
213                key,
214                other_key,
215                node
216            );
217        }
218    });
219}
220
221/// Implementation of [`DepKindVTable::promote_from_disk_fn`] for queries.
222pub(crate) fn promote_from_disk_inner<'tcx, Q: GetQueryVTable<'tcx>>(
223    tcx: TyCtxt<'tcx>,
224    dep_node: DepNode,
225) {
226    let query = Q::query_vtable(tcx);
227    if true {
    if !tcx.dep_graph.is_green(&dep_node) {
        ::core::panicking::panic("assertion failed: tcx.dep_graph.is_green(&dep_node)")
    };
};debug_assert!(tcx.dep_graph.is_green(&dep_node));
228
229    let key = <Q::Cache as QueryCache>::Key::try_recover_key(tcx, &dep_node).unwrap_or_else(|| {
230        {
    ::core::panicking::panic_fmt(format_args!("Failed to recover key for {1:?} with key fingerprint {0}",
            dep_node.key_fingerprint, dep_node));
}panic!(
231            "Failed to recover key for {dep_node:?} with key fingerprint {}",
232            dep_node.key_fingerprint
233        )
234    });
235
236    // If the recovered key isn't eligible for cache-on-disk, then there's no
237    // value on disk to promote.
238    if !(query.will_cache_on_disk_for_key_fn)(tcx, key) {
239        return;
240    }
241
242    match query.cache.lookup(&key) {
243        // If the value is already in memory, then promotion isn't needed.
244        Some(_) => {}
245
246        // "Execute" the query to load its disk-cached value into memory.
247        //
248        // We know that the key is cache-on-disk and its node is green,
249        // so there _must_ be a value on disk to load.
250        //
251        // FIXME(Zalathar): Is there a reasonable way to skip more of the
252        // query bookkeeping when doing this?
253        None => {
254            (query.execute_query_fn)(tcx, DUMMY_SP, key, QueryMode::Get);
255        }
256    }
257}
258
259pub(crate) fn loadable_from_disk<'tcx>(tcx: TyCtxt<'tcx>, id: SerializedDepNodeIndex) -> bool {
260    if let Some(cache) = tcx.query_system.on_disk_cache.as_ref() {
261        cache.loadable_from_disk(id)
262    } else {
263        false
264    }
265}
266
267pub(crate) fn try_load_from_disk<'tcx, V>(
268    tcx: TyCtxt<'tcx>,
269    prev_index: SerializedDepNodeIndex,
270    index: DepNodeIndex,
271) -> Option<V>
272where
273    V: for<'a> Decodable<CacheDecoder<'a, 'tcx>>,
274{
275    let on_disk_cache = tcx.query_system.on_disk_cache.as_ref()?;
276
277    let prof_timer = tcx.prof.incr_cache_loading();
278
279    // The call to `with_query_deserialization` enforces that no new `DepNodes`
280    // are created during deserialization. See the docs of that method for more
281    // details.
282    let value = tcx
283        .dep_graph
284        .with_query_deserialization(|| on_disk_cache.try_load_query_result(tcx, prev_index));
285
286    prof_timer.finish_with_query_invocation_id(index.into());
287
288    value
289}
290
291/// Implementation of [`DepKindVTable::force_from_dep_node_fn`] for queries.
292pub(crate) fn force_from_dep_node_inner<'tcx, Q: GetQueryVTable<'tcx>>(
293    tcx: TyCtxt<'tcx>,
294    dep_node: DepNode,
295    // Needed by the vtable function signature, but not used when forcing queries.
296    _prev_index: SerializedDepNodeIndex,
297) -> bool {
298    let query = Q::query_vtable(tcx);
299
300    // We must avoid ever having to call `force_from_dep_node()` for a
301    // `DepNode::codegen_unit`:
302    // Since we cannot reconstruct the query key of a `DepNode::codegen_unit`, we
303    // would always end up having to evaluate the first caller of the
304    // `codegen_unit` query that *is* reconstructible. This might very well be
305    // the `compile_codegen_unit` query, thus re-codegenning the whole CGU just
306    // to re-trigger calling the `codegen_unit` query with the right key. At
307    // that point we would already have re-done all the work we are trying to
308    // avoid doing in the first place.
309    // The solution is simple: Just explicitly call the `codegen_unit` query for
310    // each CGU, right after partitioning. This way `try_mark_green` will always
311    // hit the cache instead of having to go through `force_from_dep_node`.
312    // This assertion makes sure, we actually keep applying the solution above.
313    if true {
    if !(dep_node.kind != DepKind::codegen_unit) {
        {
            ::core::panicking::panic_fmt(format_args!("calling force_from_dep_node() on dep_kinds::codegen_unit"));
        }
    };
};debug_assert!(
314        dep_node.kind != DepKind::codegen_unit,
315        "calling force_from_dep_node() on dep_kinds::codegen_unit"
316    );
317
318    if let Some(key) = <Q::Cache as QueryCache>::Key::try_recover_key(tcx, &dep_node) {
319        force_query(query, tcx, key, dep_node);
320        true
321    } else {
322        false
323    }
324}
325
326macro_rules! define_queries {
327    (
328        // Note: `$K` and `$V` are unused but present so this can be called by
329        // `rustc_with_all_queries`.
330        queries {
331            $(
332                $(#[$attr:meta])*
333                fn $name:ident($K:ty) -> $V:ty
334                {
335                    // Search for (QMODLIST) to find all occurrences of this query modifier list.
336                    anon: $anon:literal,
337                    arena_cache: $arena_cache:literal,
338                    cache_on_disk: $cache_on_disk:literal,
339                    cycle_error_handling: $cycle_error_handling:ident,
340                    depth_limit: $depth_limit:literal,
341                    eval_always: $eval_always:literal,
342                    feedable: $feedable:literal,
343                    no_hash: $no_hash:literal,
344                    returns_error_guaranteed: $returns_error_guaranteed:literal,
345                    separate_provide_extern: $separate_provide_extern:literal,
346                }
347            )*
348        }
349        // Non-queries are unused here.
350        non_queries { $($_:tt)* }
351    ) => {
352        pub(crate) mod query_impl { $(pub(crate) mod $name {
353            use super::super::*;
354            use ::rustc_middle::query::erase::{self, Erased};
355
356            // It seems to be important that every query has its own monomorphic
357            // copy of `execute_query_incr` and `execute_query_non_incr`.
358            // Trying to inline these wrapper functions into their generic
359            // "inner" helpers tends to break `tests/run-make/short-ice`.
360
361            pub(crate) mod execute_query_incr {
362                use super::*;
363
364                // Adding `__rust_end_short_backtrace` marker to backtraces so that we emit the frames
365                // when `RUST_BACKTRACE=1`, add a new mod with `$name` here is to allow duplicate naming
366                #[inline(never)]
367                pub(crate) fn __rust_end_short_backtrace<'tcx>(
368                    tcx: TyCtxt<'tcx>,
369                    span: Span,
370                    key: queries::$name::Key<'tcx>,
371                    mode: QueryMode,
372                ) -> Option<Erased<queries::$name::Value<'tcx>>> {
373                    #[cfg(debug_assertions)]
374                    let _guard = tracing::span!(tracing::Level::TRACE, stringify!($name), ?key).entered();
375                    execution::execute_query_incr_inner(
376                        &tcx.query_system.query_vtables.$name,
377                        tcx,
378                        span,
379                        key,
380                        mode
381                    )
382                }
383            }
384
385            pub(crate) mod execute_query_non_incr {
386                use super::*;
387
388                #[inline(never)]
389                pub(crate) fn __rust_end_short_backtrace<'tcx>(
390                    tcx: TyCtxt<'tcx>,
391                    span: Span,
392                    key: queries::$name::Key<'tcx>,
393                    __mode: QueryMode,
394                ) -> Option<Erased<queries::$name::Value<'tcx>>> {
395                    Some(execution::execute_query_non_incr_inner(
396                        &tcx.query_system.query_vtables.$name,
397                        tcx,
398                        span,
399                        key,
400                    ))
401                }
402            }
403
404            /// Defines an `invoke_provider` function that calls the query's provider,
405            /// to be used as a function pointer in the query's vtable.
406            ///
407            /// To mark a short-backtrace boundary, the function's actual name
408            /// (after demangling) must be `__rust_begin_short_backtrace`.
409            mod invoke_provider_fn {
410                use super::*;
411                use ::rustc_middle::queries::$name::{Key, Value, provided_to_erased};
412
413                #[inline(never)]
414                pub(crate) fn __rust_begin_short_backtrace<'tcx>(
415                    tcx: TyCtxt<'tcx>,
416                    key: Key<'tcx>,
417                ) -> Erased<Value<'tcx>> {
418                    #[cfg(debug_assertions)]
419                    let _guard = tracing::span!(tracing::Level::TRACE, stringify!($name), ?key).entered();
420
421                    // Call the actual provider function for this query.
422
423                    #[cfg($separate_provide_extern)]
424                    let provided_value = if let Some(local_key) = key.as_local_key() {
425                        (tcx.query_system.local_providers.$name)(tcx, local_key)
426                    } else {
427                        (tcx.query_system.extern_providers.$name)(tcx, key)
428                    };
429
430                    #[cfg(not($separate_provide_extern))]
431                    let provided_value = (tcx.query_system.local_providers.$name)(tcx, key);
432
433                    rustc_middle::ty::print::with_reduced_queries!({
434                        tracing::trace!(?provided_value);
435                    });
436
437                    // Erase the returned value, because `QueryVTable` uses erased values.
438                    // For queries with `arena_cache`, this also arena-allocates the value.
439                    provided_to_erased(tcx, provided_value)
440                }
441            }
442
443            pub(crate) fn make_query_vtable<'tcx>(incremental: bool)
444                -> QueryVTable<'tcx, queries::$name::Cache<'tcx>>
445            {
446                QueryVTable {
447                    name: stringify!($name),
448                    anon: $anon,
449                    eval_always: $eval_always,
450                    depth_limit: $depth_limit,
451                    feedable: $feedable,
452                    dep_kind: dep_graph::DepKind::$name,
453                    cycle_error_handling:
454                        rustc_middle::query::CycleErrorHandling::$cycle_error_handling,
455                    state: Default::default(),
456                    cache: Default::default(),
457
458                    invoke_provider_fn: self::invoke_provider_fn::__rust_begin_short_backtrace,
459
460                    #[cfg($cache_on_disk)]
461                    will_cache_on_disk_for_key_fn:
462                        rustc_middle::queries::_cache_on_disk_if_fns::$name,
463                    #[cfg(not($cache_on_disk))]
464                    will_cache_on_disk_for_key_fn: |_, _| false,
465
466                    #[cfg($cache_on_disk)]
467                    try_load_from_disk_fn: |tcx, key, prev_index, index| {
468                        // Check the `cache_on_disk_if` condition for this key.
469                        if !rustc_middle::queries::_cache_on_disk_if_fns::$name(tcx, key) {
470                            return None;
471                        }
472
473                        let value: queries::$name::ProvidedValue<'tcx> =
474                            $crate::plumbing::try_load_from_disk(tcx, prev_index, index)?;
475
476                        // Arena-alloc the value if appropriate, and erase it.
477                        Some(queries::$name::provided_to_erased(tcx, value))
478                    },
479                    #[cfg(not($cache_on_disk))]
480                    try_load_from_disk_fn: |_tcx, _key, _prev_index, _index| None,
481
482                    #[cfg($cache_on_disk)]
483                    is_loadable_from_disk_fn: |tcx, key, index| -> bool {
484                        rustc_middle::queries::_cache_on_disk_if_fns::$name(tcx, key) &&
485                            $crate::plumbing::loadable_from_disk(tcx, index)
486                    },
487                    #[cfg(not($cache_on_disk))]
488                    is_loadable_from_disk_fn: |_tcx, _key, _index| false,
489
490                    value_from_cycle_error: |tcx, _, cycle, _| {
491                        $crate::from_cycle_error::default(tcx, cycle, stringify!($name))
492                    },
493
494                    #[cfg($no_hash)]
495                    hash_value_fn: None,
496                    #[cfg(not($no_hash))]
497                    hash_value_fn: Some(|hcx, erased_value: &erase::Erased<queries::$name::Value<'tcx>>| {
498                        let value = erase::restore_val(*erased_value);
499                        rustc_middle::dep_graph::hash_result(hcx, &value)
500                    }),
501
502                    format_value: |value| format!("{:?}", erase::restore_val::<queries::$name::Value<'tcx>>(*value)),
503                    description_fn: $crate::queries::_description_fns::$name,
504                    execute_query_fn: if incremental {
505                        query_impl::$name::execute_query_incr::__rust_end_short_backtrace
506                    } else {
507                        query_impl::$name::execute_query_non_incr::__rust_end_short_backtrace
508                    },
509                }
510            }
511
512            /// Marker type that implements [`GetQueryVTable`] for this query.
513            pub(crate) enum VTableGetter {}
514
515            impl<'tcx> GetQueryVTable<'tcx> for VTableGetter {
516                type Cache = rustc_middle::queries::$name::Cache<'tcx>;
517
518                #[inline(always)]
519                fn query_vtable(tcx: TyCtxt<'tcx>) -> &'tcx QueryVTable<'tcx, Self::Cache> {
520                    &tcx.query_system.query_vtables.$name
521                }
522            }
523        })*}
524
525        pub fn make_query_vtables<'tcx>(incremental: bool) -> queries::QueryVTables<'tcx> {
526            queries::QueryVTables {
527                $(
528                    $name: query_impl::$name::make_query_vtable(incremental),
529                )*
530            }
531        }
532
533        /// Given a filter condition (e.g. `ALL` or `CACHE_ON_DISK`), a `tcx`,
534        /// and a closure expression that accepts `&QueryVTable`, this macro
535        /// calls that closure with each query vtable that satisfies the filter
536        /// condition.
537        ///
538        /// This needs to be a macro, because the vtables can have different
539        /// key/value/cache types for different queries.
540        ///
541        /// This macro's argument syntax is specifically intended to look like
542        /// plain Rust code, so that `for_each_query_vtable!(..)` calls will be
543        /// formatted by rustfmt.
544        ///
545        /// To avoid too much nested-macro complication, filter conditions are
546        /// implemented by hand as needed.
547        macro_rules! for_each_query_vtable {
548            // Call with all queries.
549            (ALL, $tcx:expr, $closure:expr) => {{
550                let tcx: rustc_middle::ty::TyCtxt<'_> = $tcx;
551                $(
552                    let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
553                        &tcx.query_system.query_vtables.$name;
554                    $closure(query);
555                )*
556            }};
557
558            // Only call with queries that can potentially cache to disk.
559            //
560            // This allows the use of trait bounds that only need to be satisfied
561            // by the subset of queries that actually cache to disk.
562            (CACHE_ON_DISK, $tcx:expr, $closure:expr) => {{
563                let tcx: rustc_middle::ty::TyCtxt<'_> = $tcx;
564                $(
565                    #[cfg($cache_on_disk)]
566                    {
567                        let query: &rustc_middle::query::plumbing::QueryVTable<'_, _> =
568                            &tcx.query_system.query_vtables.$name;
569                        $closure(query);
570                    }
571                )*
572            }}
573        }
574
575        pub(crate) use for_each_query_vtable;
576    }
577}