1use std::hash::Hash;
2use std::mem;
3
4use rustc_data_structures::hash_table::{Entry, HashTable};
5use rustc_data_structures::stack::ensure_sufficient_stack;
6use rustc_data_structures::sync::{DynSend, DynSync};
7use rustc_data_structures::{outline, sharded, sync};
8use rustc_errors::{FatalError, StashKey};
9use rustc_middle::dep_graph::{DepGraphData, DepNodeKey, SerializedDepNodeIndex};
10use rustc_middle::query::plumbing::QueryVTable;
11use rustc_middle::query::{
12 ActiveKeyStatus, CycleError, CycleErrorHandling, EnsureMode, QueryCache, QueryJob, QueryJobId,
13 QueryKey, QueryLatch, QueryMode, QueryState,
14};
15use rustc_middle::ty::TyCtxt;
16use rustc_middle::verify_ich::incremental_verify_ich;
17use rustc_span::{DUMMY_SP, Span};
18
19use crate::collect_active_jobs_from_all_queries;
20use crate::dep_graph::{DepNode, DepNodeIndex};
21use crate::job::{QueryJobInfo, QueryJobMap, find_cycle_in_stack, report_cycle};
22use crate::plumbing::{current_query_job, next_job_id, start_query};
23
24#[inline]
25fn equivalent_key<K: Eq, V>(k: &K) -> impl Fn(&(K, V)) -> bool + '_ {
26 move |x| x.0 == *k
27}
28
29fn expect_job<'tcx>(status: ActiveKeyStatus<'tcx>) -> QueryJob<'tcx> {
32 match status {
33 ActiveKeyStatus::Started(job) => job,
34 ActiveKeyStatus::Poisoned => {
35 {
::core::panicking::panic_fmt(format_args!("job for query failed to start and was poisoned"));
}panic!("job for query failed to start and was poisoned")
36 }
37 }
38}
39
40pub(crate) fn all_inactive<'tcx, K>(state: &QueryState<'tcx, K>) -> bool {
41 state.active.lock_shards().all(|shard| shard.is_empty())
42}
43
44pub(crate) fn gather_active_jobs<'tcx, C>(
52 query: &'tcx QueryVTable<'tcx, C>,
53 tcx: TyCtxt<'tcx>,
54 require_complete: bool,
55 job_map_out: &mut QueryJobMap<'tcx>, ) -> Option<()>
57where
58 C: QueryCache<Key: QueryKey + DynSend + DynSync>,
59 QueryVTable<'tcx, C>: DynSync,
60{
61 let mut active = Vec::new();
62
63 let mut gather_shard_jobs = |shard: &HashTable<(C::Key, ActiveKeyStatus<'tcx>)>| {
65 for (k, v) in shard.iter() {
66 if let ActiveKeyStatus::Started(ref job) = *v {
67 active.push((*k, job.clone()));
68 }
69 }
70 };
71
72 if require_complete {
74 for shard in query.state.active.lock_shards() {
75 gather_shard_jobs(&shard);
76 }
77 } else {
78 for shard in query.state.active.try_lock_shards() {
81 match shard {
85 None => {
86 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_query_impl/src/execution.rs:86",
"rustc_query_impl::execution", ::tracing::Level::WARN,
::tracing_core::__macro_support::Option::Some("compiler/rustc_query_impl/src/execution.rs"),
::tracing_core::__macro_support::Option::Some(86u32),
::tracing_core::__macro_support::Option::Some("rustc_query_impl::execution"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::WARN <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::WARN <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Failed to collect active jobs for query with name `{0}`!",
query.name) as &dyn Value))])
});
} else { ; }
};tracing::warn!(
87 "Failed to collect active jobs for query with name `{}`!",
88 query.name
89 );
90 return None;
91 }
92 Some(shard) => gather_shard_jobs(&shard),
93 }
94 }
95 }
96
97 for (key, job) in active {
100 let frame = crate::plumbing::create_deferred_query_stack_frame(tcx, query, key);
101 job_map_out.insert(job.id, QueryJobInfo { frame, job });
102 }
103
104 Some(())
105}
106
107struct ActiveJobGuard<'tcx, K>
113where
114 K: Eq + Hash + Copy,
115{
116 state: &'tcx QueryState<'tcx, K>,
117 key: K,
118 key_hash: u64,
119}
120
121#[cold]
122#[inline(never)]
123fn mk_cycle<'tcx, C: QueryCache>(
124 query: &'tcx QueryVTable<'tcx, C>,
125 tcx: TyCtxt<'tcx>,
126 cycle_error: CycleError,
127) -> C::Value {
128 let error = report_cycle(tcx.sess, &cycle_error);
129 match query.cycle_error_handling {
130 CycleErrorHandling::Error => {
131 let guar = error.emit();
132 query.value_from_cycle_error(tcx, cycle_error, guar)
133 }
134 CycleErrorHandling::Fatal => {
135 let guar = error.emit();
136 guar.raise_fatal();
137 }
138 CycleErrorHandling::DelayBug => {
139 let guar = error.delay_as_bug();
140 query.value_from_cycle_error(tcx, cycle_error, guar)
141 }
142 CycleErrorHandling::Stash => {
143 let guar = if let Some(root) = cycle_error.cycle.first()
144 && let Some(span) = root.frame.info.span
145 {
146 error.stash(span, StashKey::Cycle).unwrap()
147 } else {
148 error.emit()
149 };
150 query.value_from_cycle_error(tcx, cycle_error, guar)
151 }
152 }
153}
154
155impl<'tcx, K> ActiveJobGuard<'tcx, K>
156where
157 K: Eq + Hash + Copy,
158{
159 fn complete<C>(self, cache: &C, result: C::Value, dep_node_index: DepNodeIndex)
162 where
163 C: QueryCache<Key = K>,
164 {
165 let Self { state, key, key_hash }: Self = self;
168 mem::forget(self);
169
170 cache.complete(key, result, dep_node_index);
173
174 let job = {
175 let mut shard = state.active.lock_shard_by_hash(key_hash);
180 match shard.find_entry(key_hash, equivalent_key(&key)) {
181 Err(_) => None,
182 Ok(occupied) => Some(occupied.remove().0.1),
183 }
184 };
185 let job = expect_job(job.expect("active query job entry"));
186
187 job.signal_complete();
188 }
189}
190
191impl<'tcx, K> Drop for ActiveJobGuard<'tcx, K>
192where
193 K: Eq + Hash + Copy,
194{
195 #[inline(never)]
196 #[cold]
197 fn drop(&mut self) {
198 let Self { state, key, key_hash } = *self;
200 let job = {
201 let mut shard = state.active.lock_shard_by_hash(key_hash);
202 match shard.find_entry(key_hash, equivalent_key(&key)) {
203 Err(_) => ::core::panicking::panic("explicit panic")panic!(),
204 Ok(occupied) => {
205 let ((key, value), vacant) = occupied.remove();
206 vacant.insert((key, ActiveKeyStatus::Poisoned));
207 expect_job(value)
208 }
209 }
210 };
211 job.signal_complete();
214 }
215}
216
217#[cold]
218#[inline(never)]
219fn cycle_error<'tcx, C: QueryCache>(
220 query: &'tcx QueryVTable<'tcx, C>,
221 tcx: TyCtxt<'tcx>,
222 try_execute: QueryJobId,
223 span: Span,
224) -> (C::Value, Option<DepNodeIndex>) {
225 let job_map = collect_active_jobs_from_all_queries(tcx, false)
228 .ok()
229 .expect("failed to collect active queries");
230
231 let error = find_cycle_in_stack(try_execute, job_map, ¤t_query_job(tcx), span);
232 (mk_cycle(query, tcx, error.lift()), None)
233}
234
235#[inline(always)]
236fn wait_for_query<'tcx, C: QueryCache>(
237 query: &'tcx QueryVTable<'tcx, C>,
238 tcx: TyCtxt<'tcx>,
239 span: Span,
240 key: C::Key,
241 latch: QueryLatch<'tcx>,
242 current: Option<QueryJobId>,
243) -> (C::Value, Option<DepNodeIndex>) {
244 let query_blocked_prof_timer = tcx.prof.query_blocked();
248
249 let result = latch.wait_on(tcx, current, span);
252
253 match result {
254 Ok(()) => {
255 let Some((v, index)) = query.cache.lookup(&key) else {
256 outline(|| {
257 let key_hash = sharded::make_hash(&key);
260 let shard = query.state.active.lock_shard_by_hash(key_hash);
261 match shard.find(key_hash, equivalent_key(&key)) {
262 Some((_, ActiveKeyStatus::Poisoned)) => FatalError.raise(),
264 _ => {
::core::panicking::panic_fmt(format_args!("query \'{0}\' result must be in the cache or the query must be poisoned after a wait",
query.name));
}panic!(
265 "query '{}' result must be in the cache or the query must be poisoned after a wait",
266 query.name
267 ),
268 }
269 })
270 };
271
272 tcx.prof.query_cache_hit(index.into());
273 query_blocked_prof_timer.finish_with_query_invocation_id(index.into());
274
275 (v, Some(index))
276 }
277 Err(cycle) => (mk_cycle(query, tcx, cycle.lift()), None),
278 }
279}
280
281#[inline(never)]
283fn try_execute_query<'tcx, C: QueryCache, const INCR: bool>(
284 query: &'tcx QueryVTable<'tcx, C>,
285 tcx: TyCtxt<'tcx>,
286 span: Span,
287 key: C::Key,
288 dep_node: Option<DepNode>,
291) -> (C::Value, Option<DepNodeIndex>) {
292 let key_hash = sharded::make_hash(&key);
293 let mut state_lock = query.state.active.lock_shard_by_hash(key_hash);
294
295 if tcx.sess.threads() > 1 {
302 if let Some((value, index)) = query.cache.lookup(&key) {
303 tcx.prof.query_cache_hit(index.into());
304 return (value, Some(index));
305 }
306 }
307
308 let current_job_id = current_query_job(tcx);
309
310 match state_lock.entry(key_hash, equivalent_key(&key), |(k, _)| sharded::make_hash(k)) {
311 Entry::Vacant(entry) => {
312 let id = next_job_id(tcx);
315 let job = QueryJob::new(id, span, current_job_id);
316 entry.insert((key, ActiveKeyStatus::Started(job)));
317
318 drop(state_lock);
320
321 execute_job::<C, INCR>(query, tcx, key, key_hash, id, dep_node)
322 }
323 Entry::Occupied(mut entry) => {
324 match &mut entry.get_mut().1 {
325 ActiveKeyStatus::Started(job) => {
326 if sync::is_dyn_thread_safe() {
327 let latch = job.latch();
329 drop(state_lock);
330
331 wait_for_query(query, tcx, span, key, latch, current_job_id)
334 } else {
335 let id = job.id;
336 drop(state_lock);
337
338 cycle_error(query, tcx, id, span)
341 }
342 }
343 ActiveKeyStatus::Poisoned => FatalError.raise(),
344 }
345 }
346 }
347}
348
349#[inline(always)]
350fn execute_job<'tcx, C: QueryCache, const INCR: bool>(
351 query: &'tcx QueryVTable<'tcx, C>,
352 tcx: TyCtxt<'tcx>,
353 key: C::Key,
354 key_hash: u64,
355 id: QueryJobId,
356 dep_node: Option<DepNode>,
357) -> (C::Value, Option<DepNodeIndex>) {
358 let job_guard = ActiveJobGuard { state: &query.state, key, key_hash };
361
362 if true {
match (&tcx.dep_graph.is_fully_enabled(), &INCR) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
};debug_assert_eq!(tcx.dep_graph.is_fully_enabled(), INCR);
363
364 let (value, dep_node_index) = if INCR {
366 execute_job_incr(query, tcx, key, dep_node, id)
367 } else {
368 execute_job_non_incr(query, tcx, key, id)
369 };
370
371 let cache = &query.cache;
372 if query.feedable {
373 if let Some((cached_value, _)) = cache.lookup(&key) {
378 let Some(hash_value_fn) = query.hash_value_fn else {
379 {
::core::panicking::panic_fmt(format_args!("no_hash fed query later has its value computed.\nRemove `no_hash` modifier to allow recomputation.\nThe already cached value: {0}",
(query.format_value)(&cached_value)));
};panic!(
380 "no_hash fed query later has its value computed.\n\
381 Remove `no_hash` modifier to allow recomputation.\n\
382 The already cached value: {}",
383 (query.format_value)(&cached_value)
384 );
385 };
386
387 let (old_hash, new_hash) = tcx.with_stable_hashing_context(|mut hcx| {
388 (hash_value_fn(&mut hcx, &cached_value), hash_value_fn(&mut hcx, &value))
389 });
390 let formatter = query.format_value;
391 if old_hash != new_hash {
392 if !tcx.dcx().has_errors().is_some() {
{
::core::panicking::panic_fmt(format_args!("Computed query value for {0:?}({1:?}) is inconsistent with fed value,\ncomputed={2:#?}\nfed={3:#?}",
query.dep_kind, key, formatter(&value),
formatter(&cached_value)));
}
};assert!(
395 tcx.dcx().has_errors().is_some(),
396 "Computed query value for {:?}({:?}) is inconsistent with fed value,\n\
397 computed={:#?}\nfed={:#?}",
398 query.dep_kind,
399 key,
400 formatter(&value),
401 formatter(&cached_value),
402 );
403 }
404 }
405 }
406
407 job_guard.complete(cache, value, dep_node_index);
409
410 (value, Some(dep_node_index))
411}
412
413#[inline(always)]
415fn execute_job_non_incr<'tcx, C: QueryCache>(
416 query: &'tcx QueryVTable<'tcx, C>,
417 tcx: TyCtxt<'tcx>,
418 key: C::Key,
419 job_id: QueryJobId,
420) -> (C::Value, DepNodeIndex) {
421 if true {
if !!tcx.dep_graph.is_fully_enabled() {
::core::panicking::panic("assertion failed: !tcx.dep_graph.is_fully_enabled()")
};
};debug_assert!(!tcx.dep_graph.is_fully_enabled());
422
423 let prof_timer = tcx.prof.query_provider();
424 let value =
426 start_query(tcx, job_id, query.depth_limit, || (query.invoke_provider_fn)(tcx, key));
427 let dep_node_index = tcx.dep_graph.next_virtual_depnode_index();
428 prof_timer.finish_with_query_invocation_id(dep_node_index.into());
429
430 if truecfg!(debug_assertions) {
432 let _ = key.to_fingerprint(tcx);
433 if let Some(hash_value_fn) = query.hash_value_fn {
434 tcx.with_stable_hashing_context(|mut hcx| {
435 hash_value_fn(&mut hcx, &value);
436 });
437 }
438 }
439
440 (value, dep_node_index)
441}
442
443#[inline(always)]
444fn execute_job_incr<'tcx, C: QueryCache>(
445 query: &'tcx QueryVTable<'tcx, C>,
446 tcx: TyCtxt<'tcx>,
447 key: C::Key,
448 mut dep_node_opt: Option<DepNode>,
449 job_id: QueryJobId,
450) -> (C::Value, DepNodeIndex) {
451 let dep_graph_data =
452 tcx.dep_graph.data().expect("should always be present in incremental mode");
453
454 if !query.anon && !query.eval_always {
455 let dep_node = dep_node_opt.get_or_insert_with(|| query.construct_dep_node(tcx, &key));
457
458 if let Some(ret) = start_query(tcx, job_id, false, || try {
461 let (prev_index, dep_node_index) = dep_graph_data.try_mark_green(tcx, dep_node)?;
462 let value = load_from_disk_or_invoke_provider_green(
463 tcx,
464 dep_graph_data,
465 query,
466 &key,
467 dep_node,
468 prev_index,
469 dep_node_index,
470 );
471 (value, dep_node_index)
472 }) {
473 return ret;
474 }
475 }
476
477 let prof_timer = tcx.prof.query_provider();
478
479 let (result, dep_node_index) = start_query(tcx, job_id, query.depth_limit, || {
480 if query.anon {
481 return dep_graph_data.with_anon_task_inner(tcx, query.dep_kind, || {
483 (query.invoke_provider_fn)(tcx, key)
484 });
485 }
486
487 let dep_node = dep_node_opt.unwrap_or_else(|| query.construct_dep_node(tcx, &key));
489
490 dep_graph_data.with_task(
492 dep_node,
493 tcx,
494 (query, key),
495 |tcx, (query, key)| (query.invoke_provider_fn)(tcx, key),
496 query.hash_value_fn,
497 )
498 });
499
500 prof_timer.finish_with_query_invocation_id(dep_node_index.into());
501
502 (result, dep_node_index)
503}
504
505#[inline(always)]
509fn load_from_disk_or_invoke_provider_green<'tcx, C: QueryCache>(
510 tcx: TyCtxt<'tcx>,
511 dep_graph_data: &DepGraphData,
512 query: &'tcx QueryVTable<'tcx, C>,
513 key: &C::Key,
514 dep_node: &DepNode,
515 prev_index: SerializedDepNodeIndex,
516 dep_node_index: DepNodeIndex,
517) -> C::Value {
518 if true {
if !dep_graph_data.is_index_green(prev_index) {
::core::panicking::panic("assertion failed: dep_graph_data.is_index_green(prev_index)")
};
};debug_assert!(dep_graph_data.is_index_green(prev_index));
522
523 if let Some(value) = query.try_load_from_disk(tcx, key, prev_index, dep_node_index) {
526 if std::intrinsics::unlikely(tcx.sess.opts.unstable_opts.query_dep_graph) {
527 dep_graph_data.mark_debug_loaded_from_disk(*dep_node)
528 }
529
530 let prev_fingerprint = dep_graph_data.prev_value_fingerprint_of(prev_index);
531 let try_verify = prev_fingerprint.split().1.as_u64().is_multiple_of(32);
539 if std::intrinsics::unlikely(
540 try_verify || tcx.sess.opts.unstable_opts.incremental_verify_ich,
541 ) {
542 incremental_verify_ich(
543 tcx,
544 dep_graph_data,
545 &value,
546 prev_index,
547 query.hash_value_fn,
548 query.format_value,
549 );
550 }
551
552 return value;
553 }
554
555 if true {
if !(!query.will_cache_on_disk_for_key(tcx, key) ||
!tcx.key_fingerprint_style(dep_node.kind).is_maybe_recoverable())
{
{
::core::panicking::panic_fmt(format_args!("missing on-disk cache entry for {0:?}",
dep_node));
}
};
};debug_assert!(
558 !query.will_cache_on_disk_for_key(tcx, key)
559 || !tcx.key_fingerprint_style(dep_node.kind).is_maybe_recoverable(),
560 "missing on-disk cache entry for {dep_node:?}"
561 );
562
563 if true {
if !!query.is_loadable_from_disk(tcx, key, prev_index) {
{
::core::panicking::panic_fmt(format_args!("missing on-disk cache entry for loadable {0:?}",
dep_node));
}
};
};debug_assert!(
566 !query.is_loadable_from_disk(tcx, key, prev_index),
567 "missing on-disk cache entry for loadable {dep_node:?}"
568 );
569
570 let prof_timer = tcx.prof.query_provider();
573
574 let value = tcx.dep_graph.with_ignore(|| (query.invoke_provider_fn)(tcx, *key));
577
578 prof_timer.finish_with_query_invocation_id(dep_node_index.into());
579
580 incremental_verify_ich(
590 tcx,
591 dep_graph_data,
592 &value,
593 prev_index,
594 query.hash_value_fn,
595 query.format_value,
596 );
597
598 value
599}
600
601struct EnsureCanSkip {
603 skip_execution: bool,
606 dep_node: Option<DepNode>,
609}
610
611#[inline(never)]
618fn check_if_ensure_can_skip_execution<'tcx, C: QueryCache>(
619 query: &'tcx QueryVTable<'tcx, C>,
620 tcx: TyCtxt<'tcx>,
621 key: &C::Key,
622 ensure_mode: EnsureMode,
623) -> EnsureCanSkip {
624 if query.eval_always {
626 return EnsureCanSkip { skip_execution: false, dep_node: None };
627 }
628
629 if !!query.anon { ::core::panicking::panic("assertion failed: !query.anon") };assert!(!query.anon);
631
632 let dep_node = query.construct_dep_node(tcx, key);
633
634 let dep_graph = &tcx.dep_graph;
635 let serialized_dep_node_index = match dep_graph.try_mark_green(tcx, &dep_node) {
636 None => {
637 return EnsureCanSkip { skip_execution: false, dep_node: Some(dep_node) };
644 }
645 Some((serialized_dep_node_index, dep_node_index)) => {
646 dep_graph.read_index(dep_node_index);
647 tcx.prof.query_cache_hit(dep_node_index.into());
648 serialized_dep_node_index
649 }
650 };
651
652 match ensure_mode {
653 EnsureMode::Ok => {
654 EnsureCanSkip { skip_execution: true, dep_node: None }
658 }
659 EnsureMode::Done => {
660 let is_loadable = query.is_loadable_from_disk(tcx, key, serialized_dep_node_index);
664 EnsureCanSkip { skip_execution: is_loadable, dep_node: Some(dep_node) }
665 }
666 }
667}
668
669#[inline(always)]
672pub(super) fn execute_query_non_incr_inner<'tcx, C: QueryCache>(
673 query: &'tcx QueryVTable<'tcx, C>,
674 tcx: TyCtxt<'tcx>,
675 span: Span,
676 key: C::Key,
677) -> C::Value {
678 if true {
if !!tcx.dep_graph.is_fully_enabled() {
::core::panicking::panic("assertion failed: !tcx.dep_graph.is_fully_enabled()")
};
};debug_assert!(!tcx.dep_graph.is_fully_enabled());
679
680 ensure_sufficient_stack(|| try_execute_query::<C, false>(query, tcx, span, key, None).0)
681}
682
683#[inline(always)]
686pub(super) fn execute_query_incr_inner<'tcx, C: QueryCache>(
687 query: &'tcx QueryVTable<'tcx, C>,
688 tcx: TyCtxt<'tcx>,
689 span: Span,
690 key: C::Key,
691 mode: QueryMode,
692) -> Option<C::Value> {
693 if true {
if !tcx.dep_graph.is_fully_enabled() {
::core::panicking::panic("assertion failed: tcx.dep_graph.is_fully_enabled()")
};
};debug_assert!(tcx.dep_graph.is_fully_enabled());
694
695 let dep_node: Option<DepNode> = match mode {
699 QueryMode::Ensure { ensure_mode } => {
700 let EnsureCanSkip { skip_execution, dep_node } =
701 check_if_ensure_can_skip_execution(query, tcx, &key, ensure_mode);
702 if skip_execution {
703 return None;
705 }
706 dep_node
707 }
708 QueryMode::Get => None,
709 };
710
711 let (result, dep_node_index) =
712 ensure_sufficient_stack(|| try_execute_query::<C, true>(query, tcx, span, key, dep_node));
713 if let Some(dep_node_index) = dep_node_index {
714 tcx.dep_graph.read_index(dep_node_index)
715 }
716 Some(result)
717}
718
719pub(crate) fn force_query<'tcx, C: QueryCache>(
720 query: &'tcx QueryVTable<'tcx, C>,
721 tcx: TyCtxt<'tcx>,
722 key: C::Key,
723 dep_node: DepNode,
724) {
725 if let Some((_, index)) = query.cache.lookup(&key) {
728 tcx.prof.query_cache_hit(index.into());
729 return;
730 }
731
732 if true {
if !!query.anon {
::core::panicking::panic("assertion failed: !query.anon")
};
};debug_assert!(!query.anon);
733
734 ensure_sufficient_stack(|| {
735 try_execute_query::<C, true>(query, tcx, DUMMY_SP, key, Some(dep_node))
736 });
737}