mod.rs 69.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
// Each of these queries corresponds to a function pointer field in the
// `Providers` struct for requesting a value of that type, and a method
// on `tcx: TyCtxt` (and `tcx.at(span)`) for doing that request in a way
// which memoizes and does dep-graph tracking, wrapping around the actual
// `Providers` that the driver creates (using several `rustc_*` crates).
//
// The result type of each query must implement `Clone`, and additionally
// `ty::query::values::Value`, which produces an appropriate placeholder
// (error) value if the query resulted in a query cycle.
// Queries marked with `fatal_cycle` do not need the latter implementation,
// as they will raise an fatal error on query cycles instead.
rustc_queries! {
13 14 15
    query trigger_delay_span_bug(key: DefId) -> () {
        desc { "trigger a delay span bug" }
    }
16

17 18 19 20 21 22 23 24 25 26 27
    /// Represents crate as a whole (as distinct from the top-level crate module).
    /// If you call `hir_crate` (e.g., indirectly by calling `tcx.hir().krate()`),
    /// we will have to assume that any change means that you need to be recompiled.
    /// This is because the `hir_crate` query gives you access to all other items.
    /// To avoid this fate, do not call `tcx.hir().krate()`; instead,
    /// prefer wrappers like `tcx.visit_all_items_in_krate()`.
    query hir_crate(key: CrateNum) -> &'tcx Crate<'tcx> {
        eval_always
        no_hash
        desc { "get the crate HIR" }
    }
J
John Kåre Alsaker 已提交
28

29 30
    /// The indexed HIR. This can be conveniently accessed by `tcx.hir()`.
    /// Avoid calling this query directly.
31
    query index_hir(_: CrateNum) -> &'tcx crate::hir::IndexedHir<'tcx> {
32 33 34 35
        eval_always
        no_hash
        desc { "index HIR" }
    }
J
John Kåre Alsaker 已提交
36

37 38 39 40 41 42 43 44
    /// The items in a module.
    ///
    /// This can be conveniently accessed by `tcx.hir().visit_item_likes_in_module`.
    /// Avoid calling this query directly.
    query hir_module_items(key: LocalDefId) -> &'tcx hir::ModuleItems {
        eval_always
        desc { |tcx| "HIR module items in `{}`", tcx.def_path_str(key.to_def_id()) }
    }
45

46 47 48 49 50 51 52 53
    /// Gives access to the HIR node for the HIR owner `key`.
    ///
    /// This can be conveniently accessed by methods on `tcx.hir()`.
    /// Avoid calling this query directly.
    query hir_owner(key: LocalDefId) -> Option<&'tcx crate::hir::Owner<'tcx>> {
        eval_always
        desc { |tcx| "HIR owner of `{}`", tcx.def_path_str(key.to_def_id()) }
    }
J
John Kåre Alsaker 已提交
54

55 56 57 58 59 60 61 62 63
    /// Gives access to the HIR node's parent for the HIR owner `key`.
    ///
    /// This can be conveniently accessed by methods on `tcx.hir()`.
    /// Avoid calling this query directly.
    query hir_owner_parent(key: LocalDefId) -> hir::HirId {
        eval_always
        desc { |tcx| "HIR parent of `{}`", tcx.def_path_str(key.to_def_id()) }
    }

64 65 66 67 68 69 70 71
    /// Gives access to the HIR nodes and bodies inside the HIR owner `key`.
    ///
    /// This can be conveniently accessed by methods on `tcx.hir()`.
    /// Avoid calling this query directly.
    query hir_owner_nodes(key: LocalDefId) -> Option<&'tcx crate::hir::OwnerNodes<'tcx>> {
        eval_always
        desc { |tcx| "HIR owner items in `{}`", tcx.def_path_str(key.to_def_id()) }
    }
J
John Kåre Alsaker 已提交
72

73 74 75 76
    /// Gives access to the HIR attributes inside the HIR owner `key`.
    ///
    /// This can be conveniently accessed by methods on `tcx.hir()`.
    /// Avoid calling this query directly.
77
    query hir_attrs(key: LocalDefId) -> rustc_middle::hir::AttributeMap<'tcx> {
78 79 80 81
        eval_always
        desc { |tcx| "HIR owner attributes in `{}`", tcx.def_path_str(key.to_def_id()) }
    }

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    /// Computes the `DefId` of the corresponding const parameter in case the `key` is a
    /// const argument and returns `None` otherwise.
    ///
    /// ```ignore (incomplete)
    /// let a = foo::<7>();
    /// //            ^ Calling `opt_const_param_of` for this argument,
    ///
    /// fn foo<const N: usize>()
    /// //           ^ returns this `DefId`.
    ///
    /// fn bar() {
    /// // ^ While calling `opt_const_param_of` for other bodies returns `None`.
    /// }
    /// ```
    // It looks like caching this query on disk actually slightly
    // worsened performance in #74376.
    //
    // Once const generics are more prevalently used, we might want to
    // consider only caching calls returning `Some`.
    query opt_const_param_of(key: LocalDefId) -> Option<DefId> {
        desc { |tcx| "computing the optional const parameter of `{}`", tcx.def_path_str(key.to_def_id()) }
    }
104

K
kadmin 已提交
105
    /// Given the def_id of a const-generic parameter, computes the associated default const
K
kadmin 已提交
106
    /// parameter. e.g. `fn example<const N: usize=3>` called on `N` would return `3`.
K
kadmin 已提交
107 108 109 110
    query const_param_default(param: DefId) -> &'tcx ty::Const<'tcx> {
        desc { |tcx| "compute const default for a given parameter `{}`", tcx.def_path_str(param)  }
    }

111 112 113 114 115
    /// Records the type of every item.
    query type_of(key: DefId) -> Ty<'tcx> {
        desc { |tcx| "computing type of `{}`", tcx.def_path_str(key) }
        cache_on_disk_if { key.is_local() }
    }
116

117 118 119 120
    query analysis(key: CrateNum) -> Result<(), ErrorReported> {
        eval_always
        desc { "running analysis passes on this crate" }
    }
121

122 123 124 125 126 127 128
    /// Maps from the `DefId` of an item (trait/struct/enum/fn) to its
    /// associated generics.
    query generics_of(key: DefId) -> ty::Generics {
        desc { |tcx| "computing generics of `{}`", tcx.def_path_str(key) }
        storage(ArenaCacheSelector<'tcx>)
        cache_on_disk_if { key.is_local() }
    }
129

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
    /// Maps from the `DefId` of an item (trait/struct/enum/fn) to the
    /// predicates (where-clauses) that must be proven true in order
    /// to reference it. This is almost always the "predicates query"
    /// that you want.
    ///
    /// `predicates_of` builds on `predicates_defined_on` -- in fact,
    /// it is almost always the same as that query, except for the
    /// case of traits. For traits, `predicates_of` contains
    /// an additional `Self: Trait<...>` predicate that users don't
    /// actually write. This reflects the fact that to invoke the
    /// trait (e.g., via `Default::default`) you must supply types
    /// that actually implement the trait. (However, this extra
    /// predicate gets in the way of some checks, which are intended
    /// to operate over only the actual where-clauses written by the
    /// user.)
    query predicates_of(key: DefId) -> ty::GenericPredicates<'tcx> {
        desc { |tcx| "computing predicates of `{}`", tcx.def_path_str(key) }
        cache_on_disk_if { key.is_local() }
    }
149

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
    /// Returns the list of bounds that can be used for
    /// `SelectionCandidate::ProjectionCandidate(_)` and
    /// `ProjectionTyCandidate::TraitDef`.
    /// Specifically this is the bounds written on the trait's type
    /// definition, or those after the `impl` keyword
    ///
    /// ```ignore (incomplete)
    /// type X: Bound + 'lt
    /// //      ^^^^^^^^^^^
    /// impl Debug + Display
    /// //   ^^^^^^^^^^^^^^^
    /// ```
    ///
    /// `key` is the `DefId` of the associated type or opaque type.
    ///
    /// Bounds from the parent (e.g. with nested impl trait) are not included.
    query explicit_item_bounds(key: DefId) -> &'tcx [(ty::Predicate<'tcx>, Span)] {
        desc { |tcx| "finding item bounds for `{}`", tcx.def_path_str(key) }
    }
M
Matthew Jasper 已提交
169

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
    /// Elaborated version of the predicates from `explicit_item_bounds`.
    ///
    /// For example:
    ///
    /// ```
    /// trait MyTrait {
    ///     type MyAType: Eq + ?Sized;
    /// }
    /// ```
    ///
    /// `explicit_item_bounds` returns `[<Self as MyTrait>::MyAType: Eq]`,
    /// and `item_bounds` returns
    /// ```text
    /// [
    ///     <Self as Trait>::MyAType: Eq,
    ///     <Self as Trait>::MyAType: PartialEq<<Self as Trait>::MyAType>
    /// ]
    /// ```
    ///
    /// Bounds from the parent (e.g. with nested impl trait) are not included.
    query item_bounds(key: DefId) -> &'tcx ty::List<ty::Predicate<'tcx>> {
        desc { |tcx| "elaborating item bounds for `{}`", tcx.def_path_str(key) }
    }
193

194 195 196
    query projection_ty_from_predicates(key: (DefId, DefId)) -> Option<ty::ProjectionTy<'tcx>> {
        desc { |tcx| "finding projection type inside predicates of `{}`", tcx.def_path_str(key.0) }
    }
C
csmoe 已提交
197

198 199 200
    query native_libraries(_: CrateNum) -> Lrc<Vec<NativeLib>> {
        desc { "looking up the native libraries of a linked crate" }
    }
201

202 203 204 205 206
    query lint_levels(_: CrateNum) -> LintLevelMap {
        storage(ArenaCacheSelector<'tcx>)
        eval_always
        desc { "computing the lint levels for items in this crate" }
    }
207

208 209 210 211
    query parent_module_from_def_id(key: LocalDefId) -> LocalDefId {
        eval_always
        desc { |tcx| "parent module of `{}`", tcx.def_path_str(key.to_def_id()) }
    }
212

213 214 215 216
    /// Internal helper query. Use `tcx.expansion_that_defined` instead
    query expn_that_defined(key: DefId) -> rustc_span::ExpnId {
        desc { |tcx| "expansion that defined `{}`", tcx.def_path_str(key) }
    }
217

218 219 220 221
    query is_panic_runtime(_: CrateNum) -> bool {
        fatal_cycle
        desc { "checking if the crate is_panic_runtime" }
    }
222

223 224 225 226 227 228 229
    /// Set of all the `DefId`s in this crate that have MIR associated with
    /// them. This includes all the body owners, but also things like struct
    /// constructors.
    query mir_keys(_: CrateNum) -> FxHashSet<LocalDefId> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "getting a list of all mir_keys" }
    }
230

231 232 233 234 235 236 237 238 239 240 241 242 243
    /// Maps DefId's that have an associated `mir::Body` to the result
    /// of the MIR const-checking pass. This is the set of qualifs in
    /// the final value of a `const`.
    query mir_const_qualif(key: DefId) -> mir::ConstQualifs {
        desc { |tcx| "const checking `{}`", tcx.def_path_str(key) }
        cache_on_disk_if { key.is_local() }
    }
    query mir_const_qualif_const_arg(
        key: (LocalDefId, DefId)
    ) -> mir::ConstQualifs {
        desc {
            |tcx| "const checking the const argument `{}`",
            tcx.def_path_str(key.0.to_def_id())
B
Bastian Kauschke 已提交
244
        }
245
    }
246

247 248 249 250 251
    /// Fetch the MIR for a given `DefId` right after it's built - this includes
    /// unreachable code.
    query mir_built(key: ty::WithOptConstParam<LocalDefId>) -> &'tcx Steal<mir::Body<'tcx>> {
        desc { |tcx| "building MIR for `{}`", tcx.def_path_str(key.did.to_def_id()) }
    }
252

253 254 255 256 257 258 259 260 261 262 263 264
    /// Fetch the MIR for a given `DefId` up till the point where it is
    /// ready for const qualification.
    ///
    /// See the README for the `mir` module for details.
    query mir_const(key: ty::WithOptConstParam<LocalDefId>) -> &'tcx Steal<mir::Body<'tcx>> {
        desc {
            |tcx| "processing MIR for {}`{}`",
            if key.const_param_did.is_some() { "the const argument " } else { "" },
            tcx.def_path_str(key.did.to_def_id()),
        }
        no_hash
    }
265

266 267 268 269 270 271
    /// Try to build an abstract representation of the given constant.
    query mir_abstract_const(
        key: DefId
    ) -> Result<Option<&'tcx [mir::abstract_const::Node<'tcx>]>, ErrorReported> {
        desc {
            |tcx| "building an abstract representation for {}", tcx.def_path_str(key),
B
Bastian Kauschke 已提交
272
        }
273 274 275 276 277 278 279 280 281
    }
    /// Try to build an abstract representation of the given constant.
    query mir_abstract_const_of_const_arg(
        key: (LocalDefId, DefId)
    ) -> Result<Option<&'tcx [mir::abstract_const::Node<'tcx>]>, ErrorReported> {
        desc {
            |tcx|
            "building an abstract representation for the const argument {}",
            tcx.def_path_str(key.0.to_def_id()),
B
Bastian Kauschke 已提交
282
        }
283
    }
B
Bastian Kauschke 已提交
284

285 286 287 288 289 290 291
    query try_unify_abstract_consts(key: (
        (ty::WithOptConstParam<DefId>, SubstsRef<'tcx>),
        (ty::WithOptConstParam<DefId>, SubstsRef<'tcx>)
    )) -> bool {
        desc {
            |tcx| "trying to unify the generic constants {} and {}",
            tcx.def_path_str(key.0.0.did), tcx.def_path_str(key.1.0.did)
292
        }
293
    }
294

295 296 297 298 299 300
    query mir_drops_elaborated_and_const_checked(
        key: ty::WithOptConstParam<LocalDefId>
    ) -> &'tcx Steal<mir::Body<'tcx>> {
        no_hash
        desc { |tcx| "elaborating drops for `{}`", tcx.def_path_str(key.did.to_def_id()) }
    }
301

302 303 304 305 306 307
    query mir_for_ctfe(
        key: DefId
    ) -> &'tcx mir::Body<'tcx> {
        desc { |tcx| "caching mir of `{}` for CTFE", tcx.def_path_str(key) }
        cache_on_disk_if { key.is_local() }
    }
308

309 310 311 312
    query mir_for_ctfe_of_const_arg(key: (LocalDefId, DefId)) -> &'tcx mir::Body<'tcx> {
        desc {
            |tcx| "MIR for CTFE of the const argument `{}`",
            tcx.def_path_str(key.0.to_def_id())
313
        }
314
    }
315

316 317 318 319 320 321 322 323 324 325
    query mir_promoted(key: ty::WithOptConstParam<LocalDefId>) ->
        (
            &'tcx Steal<mir::Body<'tcx>>,
            &'tcx Steal<IndexVec<mir::Promoted, mir::Body<'tcx>>>
        ) {
        no_hash
        desc {
            |tcx| "processing {}`{}`",
            if key.const_param_did.is_some() { "the const argument " } else { "" },
            tcx.def_path_str(key.did.to_def_id()),
326
        }
327
    }
328

329 330 331 332 333 334
    /// MIR after our optimization passes have run. This is MIR that is ready
    /// for codegen. This is also the only query that can fetch non-local MIR, at present.
    query optimized_mir(key: DefId) -> &'tcx mir::Body<'tcx> {
        desc { |tcx| "optimizing MIR for `{}`", tcx.def_path_str(key) }
        cache_on_disk_if { key.is_local() }
    }
335

336 337 338 339 340 341 342
    /// Returns coverage summary info for a function, after executing the `InstrumentCoverage`
    /// MIR pass (assuming the -Zinstrument-coverage option is enabled).
    query coverageinfo(key: DefId) -> mir::CoverageInfo {
        desc { |tcx| "retrieving coverage info from MIR for `{}`", tcx.def_path_str(key) }
        storage(ArenaCacheSelector<'tcx>)
        cache_on_disk_if { key.is_local() }
    }
R
Rich Kadel 已提交
343

344 345
    /// Returns the name of the file that contains the function body, if instrumented for coverage.
    query covered_file_name(key: DefId) -> Option<Symbol> {
346 347 348 349
        desc {
            |tcx| "retrieving the covered file name, if instrumented, for `{}`",
            tcx.def_path_str(key)
        }
350 351 352
        storage(ArenaCacheSelector<'tcx>)
        cache_on_disk_if { key.is_local() }
    }
R
Rich Kadel 已提交
353

354 355 356
    /// Returns the `CodeRegions` for a function that has instrumented coverage, in case the
    /// function was optimized out before codegen, and before being added to the Coverage Map.
    query covered_code_regions(key: DefId) -> Vec<&'tcx mir::coverage::CodeRegion> {
357 358 359 360
        desc {
            |tcx| "retrieving the covered `CodeRegion`s, if instrumented, for `{}`",
            tcx.def_path_str(key)
        }
361 362 363
        storage(ArenaCacheSelector<'tcx>)
        cache_on_disk_if { key.is_local() }
    }
R
Rich Kadel 已提交
364

365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
    /// The `DefId` is the `DefId` of the containing MIR body. Promoteds do not have their own
    /// `DefId`. This function returns all promoteds in the specified body. The body references
    /// promoteds by the `DefId` and the `mir::Promoted` index. This is necessary, because
    /// after inlining a body may refer to promoteds from other bodies. In that case you still
    /// need to use the `DefId` of the original body.
    query promoted_mir(key: DefId) -> &'tcx IndexVec<mir::Promoted, mir::Body<'tcx>> {
        desc { |tcx| "optimizing promoted MIR for `{}`", tcx.def_path_str(key) }
        cache_on_disk_if { key.is_local() }
    }
    query promoted_mir_of_const_arg(
        key: (LocalDefId, DefId)
    ) -> &'tcx IndexVec<mir::Promoted, mir::Body<'tcx>> {
        desc {
            |tcx| "optimizing promoted MIR for the const argument `{}`",
            tcx.def_path_str(key.0.to_def_id()),
B
Bastian Kauschke 已提交
380
        }
381
    }
382

383 384 385 386 387 388 389 390 391 392 393 394 395
    /// Erases regions from `ty` to yield a new type.
    /// Normally you would just use `tcx.erase_regions(value)`,
    /// however, which uses this query as a kind of cache.
    query erase_regions_ty(ty: Ty<'tcx>) -> Ty<'tcx> {
        // This query is not expected to have input -- as a result, it
        // is not a good candidates for "replay" because it is essentially a
        // pure function of its input (and hence the expectation is that
        // no caller would be green **apart** from just these
        // queries). Making it anonymous avoids hashing the result, which
        // may save a bit of time.
        anon
        desc { "erasing regions from `{:?}`", ty }
    }
396

397 398 399 400
    query wasm_import_module_map(_: CrateNum) -> FxHashMap<DefId, String> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "wasm import module map" }
    }
401

402 403 404 405 406 407 408
    /// Maps from the `DefId` of an item (trait/struct/enum/fn) to the
    /// predicates (where-clauses) directly defined on it. This is
    /// equal to the `explicit_predicates_of` predicates plus the
    /// `inferred_outlives_of` predicates.
    query predicates_defined_on(key: DefId) -> ty::GenericPredicates<'tcx> {
        desc { |tcx| "computing predicates of `{}`", tcx.def_path_str(key) }
    }
409

410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
    /// Returns everything that looks like a predicate written explicitly
    /// by the user on a trait item.
    ///
    /// Traits are unusual, because predicates on associated types are
    /// converted into bounds on that type for backwards compatibility:
    ///
    /// trait X where Self::U: Copy { type U; }
    ///
    /// becomes
    ///
    /// trait X { type U: Copy; }
    ///
    /// `explicit_predicates_of` and `explicit_item_bounds` will then take
    /// the appropriate subsets of the predicates here.
    query trait_explicit_predicates_and_bounds(key: LocalDefId) -> ty::GenericPredicates<'tcx> {
        desc { |tcx| "computing explicit predicates of trait `{}`", tcx.def_path_str(key.to_def_id()) }
    }
427

428 429 430 431
    /// Returns the predicates written explicitly by the user.
    query explicit_predicates_of(key: DefId) -> ty::GenericPredicates<'tcx> {
        desc { |tcx| "computing explicit predicates of `{}`", tcx.def_path_str(key) }
    }
432

433 434 435 436 437
    /// Returns the inferred outlives predicates (e.g., for `struct
    /// Foo<'a, T> { x: &'a T }`, this would return `T: 'a`).
    query inferred_outlives_of(key: DefId) -> &'tcx [(ty::Predicate<'tcx>, Span)] {
        desc { |tcx| "computing inferred outlives predicates of `{}`", tcx.def_path_str(key) }
    }
438

439 440 441 442 443 444 445
    /// Maps from the `DefId` of a trait to the list of
    /// super-predicates. This is a subset of the full list of
    /// predicates. We store these in a separate map because we must
    /// evaluate them even during type conversion, often before the
    /// full predicates are available (note that supertraits have
    /// additional acyclicity requirements).
    query super_predicates_of(key: DefId) -> ty::GenericPredicates<'tcx> {
446 447 448 449 450 451 452 453 454 455 456 457
        desc { |tcx| "computing the super predicates of `{}`", tcx.def_path_str(key) }
    }

    /// The `Option<Ident>` is the name of an associated type. If it is `None`, then this query
    /// returns the full set of predicates. If `Some<Ident>`, then the query returns only the
    /// subset of super-predicates that reference traits that define the given associated type.
    /// This is used to avoid cycles in resolving types like `T::Item`.
    query super_predicates_that_define_assoc_type(key: (DefId, Option<rustc_span::symbol::Ident>)) -> ty::GenericPredicates<'tcx> {
        desc { |tcx| "computing the super traits of `{}`{}",
            tcx.def_path_str(key.0),
            if let Some(assoc_name) = key.1 { format!(" with associated type name `{}`", assoc_name) } else { "".to_string() },
        }
458
    }
459

460 461
    /// To avoid cycles within the predicates of a single item we compute
    /// per-type-parameter predicates for resolving `T::AssocTy`.
462
    query type_param_predicates(key: (DefId, LocalDefId, rustc_span::symbol::Ident)) -> ty::GenericPredicates<'tcx> {
463 464 465 466 467
        desc { |tcx| "computing the bounds for type parameter `{}`", {
            let id = tcx.hir().local_def_id_to_hir_id(key.1);
            tcx.hir().ty_param_name(id)
        }}
    }
468

469 470 471 472 473 474 475 476 477 478
    query trait_def(key: DefId) -> ty::TraitDef {
        desc { |tcx| "computing trait definition for `{}`", tcx.def_path_str(key) }
        storage(ArenaCacheSelector<'tcx>)
    }
    query adt_def(key: DefId) -> &'tcx ty::AdtDef {
        desc { |tcx| "computing ADT definition for `{}`", tcx.def_path_str(key) }
    }
    query adt_destructor(key: DefId) -> Option<ty::Destructor> {
        desc { |tcx| "computing `Drop` impl for `{}`", tcx.def_path_str(key) }
    }
479

480 481 482 483 484 485 486 487 488 489 490
    // The cycle error here should be reported as an error by `check_representable`.
    // We consider the type as Sized in the meanwhile to avoid
    // further errors (done in impl Value for AdtSizedConstraint).
    // Use `cycle_delay_bug` to delay the cycle error here to be emitted later
    // in case we accidentally otherwise don't emit an error.
    query adt_sized_constraint(
        key: DefId
    ) -> AdtSizedConstraint<'tcx> {
        desc { |tcx| "computing `Sized` constraints for `{}`", tcx.def_path_str(key) }
        cycle_delay_bug
    }
491

492 493 494 495 496
    query adt_dtorck_constraint(
        key: DefId
    ) -> Result<DtorckConstraint<'tcx>, NoSolution> {
        desc { |tcx| "computing drop-check constraints for `{}`", tcx.def_path_str(key) }
    }
497

498 499 500 501 502 503 504 505 506
    /// Returns `true` if this is a const fn, use the `is_const_fn` to know whether your crate
    /// actually sees it as const fn (e.g., the const-fn-ness might be unstable and you might
    /// not have the feature gate active).
    ///
    /// **Do not call this function manually.** It is only meant to cache the base data for the
    /// `is_const_fn` function.
    query is_const_fn_raw(key: DefId) -> bool {
        desc { |tcx| "checking if item is const fn: `{}`", tcx.def_path_str(key) }
    }
507

508 509 510 511 512 513 514
    /// Returns `true` if this is a const `impl`. **Do not call this function manually.**
    ///
    /// This query caches the base data for the `is_const_impl` helper function, which also
    /// takes into account stability attributes (e.g., `#[rustc_const_unstable]`).
    query is_const_impl_raw(key: DefId) -> bool {
        desc { |tcx| "checking if item is const impl: `{}`", tcx.def_path_str(key) }
    }
D
Dylan MacKenzie 已提交
515

516 517 518
    query asyncness(key: DefId) -> hir::IsAsync {
        desc { |tcx| "checking if the function is async: `{}`", tcx.def_path_str(key) }
    }
C
csmoe 已提交
519

520 521 522 523 524 525 526 527 528 529
    /// Returns `true` if calls to the function may be promoted.
    ///
    /// This is either because the function is e.g., a tuple-struct or tuple-variant
    /// constructor, or because it has the `#[rustc_promotable]` attribute. The attribute should
    /// be removed in the future in favour of some form of check which figures out whether the
    /// function does not inspect the bits of any of its arguments (so is essentially just a
    /// constructor function).
    query is_promotable_const_fn(key: DefId) -> bool {
        desc { |tcx| "checking if item is promotable: `{}`", tcx.def_path_str(key) }
    }
530

531 532 533 534
    /// Returns `true` if this is a foreign item (i.e., linked via `extern { ... }`).
    query is_foreign_item(key: DefId) -> bool {
        desc { |tcx| "checking if `{}` is a foreign item", tcx.def_path_str(key) }
    }
535

536 537 538 539
    /// Returns `Some(mutability)` if the node pointed to by `def_id` is a static item.
    query static_mutability(def_id: DefId) -> Option<hir::Mutability> {
        desc { |tcx| "looking up static mutability of `{}`", tcx.def_path_str(def_id) }
    }
540

541 542 543 544
    /// Returns `Some(generator_kind)` if the node pointed to by `def_id` is a generator.
    query generator_kind(def_id: DefId) -> Option<hir::GeneratorKind> {
        desc { |tcx| "looking up generator kind of `{}`", tcx.def_path_str(def_id) }
    }
M
Mark Mansi 已提交
545

546 547 548 549 550
    /// Gets a map with the variance of every item; use `item_variance` instead.
    query crate_variances(_: CrateNum) -> ty::CrateVariancesMap<'tcx> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "computing the variances for items in this crate" }
    }
551

552 553 554 555
    /// Maps from the `DefId` of a type or region parameter to its (inferred) variance.
    query variances_of(def_id: DefId) -> &'tcx [ty::Variance] {
        desc { |tcx| "computing the variances of `{}`", tcx.def_path_str(def_id) }
    }
556

557 558 559 560 561 562
    /// Maps from thee `DefId` of a type to its (inferred) outlives.
    query inferred_outlives_crate(_: CrateNum)
        -> ty::CratePredicatesMap<'tcx> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "computing the inferred outlives predicates for items in this crate" }
    }
563

564 565 566 567
    /// Maps from an impl/trait `DefId to a list of the `DefId`s of its items.
    query associated_item_def_ids(key: DefId) -> &'tcx [DefId] {
        desc { |tcx| "collecting associated items of `{}`", tcx.def_path_str(key) }
    }
568

569 570 571 572 573
    /// Maps from a trait item to the trait item "descriptor".
    query associated_item(key: DefId) -> ty::AssocItem {
        desc { |tcx| "computing associated item data for `{}`", tcx.def_path_str(key) }
        storage(ArenaCacheSelector<'tcx>)
    }
574

575
    /// Collects the associated items defined on a trait or impl.
H
hi-rustin 已提交
576
    query associated_items(key: DefId) -> ty::AssocItems<'tcx> {
577 578 579
        storage(ArenaCacheSelector<'tcx>)
        desc { |tcx| "collecting associated items of {}", tcx.def_path_str(key) }
    }
580

581 582 583 584 585 586 587 588
    /// Given an `impl_id`, return the trait it implements.
    /// Return `None` if this is an inherent impl.
    query impl_trait_ref(impl_id: DefId) -> Option<ty::TraitRef<'tcx>> {
        desc { |tcx| "computing trait implemented by `{}`", tcx.def_path_str(impl_id) }
    }
    query impl_polarity(impl_id: DefId) -> ty::ImplPolarity {
        desc { |tcx| "computing implementation polarity of `{}`", tcx.def_path_str(impl_id) }
    }
589

590 591 592
    query issue33140_self_ty(key: DefId) -> Option<ty::Ty<'tcx>> {
        desc { |tcx| "computing Self type wrt issue #33140 `{}`", tcx.def_path_str(key) }
    }
593

594 595 596 597 598 599 600
    /// Maps a `DefId` of a type to a list of its inherent impls.
    /// Contains implementations of methods that are inherent to a type.
    /// Methods in these implementations don't need to be exported.
    query inherent_impls(key: DefId) -> &'tcx [DefId] {
        desc { |tcx| "collecting inherent impls for `{}`", tcx.def_path_str(key) }
        eval_always
    }
601

602 603 604 605 606 607 608 609 610
    /// The result of unsafety-checking this `LocalDefId`.
    query unsafety_check_result(key: LocalDefId) -> &'tcx mir::UnsafetyCheckResult {
        desc { |tcx| "unsafety-checking `{}`", tcx.def_path_str(key.to_def_id()) }
        cache_on_disk_if { true }
    }
    query unsafety_check_result_for_const_arg(key: (LocalDefId, DefId)) -> &'tcx mir::UnsafetyCheckResult {
        desc {
            |tcx| "unsafety-checking the const argument `{}`",
            tcx.def_path_str(key.0.to_def_id())
611
        }
612
    }
613

614 615 616 617 618 619 620 621
    /// HACK: when evaluated, this reports a "unsafe derive on repr(packed)" error.
    ///
    /// Unsafety checking is executed for each method separately, but we only want
    /// to emit this error once per derive. As there are some impls with multiple
    /// methods, we use a query for deduplication.
    query unsafe_derive_on_repr_packed(key: LocalDefId) -> () {
        desc { |tcx| "processing `{}`", tcx.def_path_str(key.to_def_id()) }
    }
622

623 624 625 626
    /// The signature of functions.
    query fn_sig(key: DefId) -> ty::PolyFnSig<'tcx> {
        desc { |tcx| "computing function signature of `{}`", tcx.def_path_str(key) }
    }
627

628 629 630
    query lint_mod(key: LocalDefId) -> () {
        desc { |tcx| "linting {}", describe_as_module(key, tcx) }
    }
631

632 633 634 635
    /// Checks the attributes in the module.
    query check_mod_attrs(key: LocalDefId) -> () {
        desc { |tcx| "checking attributes in {}", describe_as_module(key, tcx) }
    }
636

637 638 639
    query check_mod_unstable_api_usage(key: LocalDefId) -> () {
        desc { |tcx| "checking for unstable API usage in {}", describe_as_module(key, tcx) }
    }
640

641 642 643 644
    /// Checks the const bodies in the module for illegal operations (e.g. `if` or `loop`).
    query check_mod_const_bodies(key: LocalDefId) -> () {
        desc { |tcx| "checking consts in {}", describe_as_module(key, tcx) }
    }
645

646 647 648 649
    /// Checks the loops in the module.
    query check_mod_loops(key: LocalDefId) -> () {
        desc { |tcx| "checking loops in {}", describe_as_module(key, tcx) }
    }
650

651 652 653
    query check_mod_naked_functions(key: LocalDefId) -> () {
        desc { |tcx| "checking naked functions in {}", describe_as_module(key, tcx) }
    }
654

655 656 657
    query check_mod_item_types(key: LocalDefId) -> () {
        desc { |tcx| "checking item types in {}", describe_as_module(key, tcx) }
    }
658

659 660 661
    query check_mod_privacy(key: LocalDefId) -> () {
        desc { |tcx| "checking privacy in {}", describe_as_module(key, tcx) }
    }
662

663 664 665
    query check_mod_intrinsics(key: LocalDefId) -> () {
        desc { |tcx| "checking intrinsics in {}", describe_as_module(key, tcx) }
    }
666

667 668 669
    query check_mod_liveness(key: LocalDefId) -> () {
        desc { |tcx| "checking liveness of variables in {}", describe_as_module(key, tcx) }
    }
670

671 672 673
    query check_mod_impl_wf(key: LocalDefId) -> () {
        desc { |tcx| "checking that impls are well-formed in {}", describe_as_module(key, tcx) }
    }
674

675 676 677
    query collect_mod_item_types(key: LocalDefId) -> () {
        desc { |tcx| "collecting item types in {}", describe_as_module(key, tcx) }
    }
O
oli 已提交
678

679 680 681 682
    /// Caches `CoerceUnsized` kinds for impls on custom types.
    query coerce_unsized_info(key: DefId)
        -> ty::adjustment::CoerceUnsizedInfo {
            desc { |tcx| "computing CoerceUnsized info for `{}`", tcx.def_path_str(key) }
O
oli 已提交
683 684
        }

685 686 687
    query typeck_item_bodies(_: CrateNum) -> () {
        desc { "type-checking all item bodies" }
    }
688

689 690 691 692 693 694 695 696 697 698
    query typeck(key: LocalDefId) -> &'tcx ty::TypeckResults<'tcx> {
        desc { |tcx| "type-checking `{}`", tcx.def_path_str(key.to_def_id()) }
        cache_on_disk_if { true }
    }
    query typeck_const_arg(
        key: (LocalDefId, DefId)
    ) -> &'tcx ty::TypeckResults<'tcx> {
        desc {
            |tcx| "type-checking the const argument `{}`",
            tcx.def_path_str(key.0.to_def_id()),
699
        }
700 701 702 703 704 705
    }
    query diagnostic_only_typeck(key: LocalDefId) -> &'tcx ty::TypeckResults<'tcx> {
        desc { |tcx| "type-checking `{}`", tcx.def_path_str(key.to_def_id()) }
        cache_on_disk_if { true }
        load_cached(tcx, id) {
            let typeck_results: Option<ty::TypeckResults<'tcx>> = tcx
706
                .on_disk_cache.as_ref()
707
                .and_then(|c| c.try_load_query_result(*tcx, id));
M
Mark Mansi 已提交
708

709
            typeck_results.map(|x| &*tcx.arena.alloc(x))
710
        }
711
    }
712

713 714 715 716
    query used_trait_imports(key: LocalDefId) -> &'tcx FxHashSet<LocalDefId> {
        desc { |tcx| "used_trait_imports `{}`", tcx.def_path_str(key.to_def_id()) }
        cache_on_disk_if { true }
    }
717

718 719 720
    query has_typeck_results(def_id: DefId) -> bool {
        desc { |tcx| "checking whether `{}` has a body", tcx.def_path_str(def_id) }
    }
721

722 723 724
    query coherent_trait(def_id: DefId) -> () {
        desc { |tcx| "coherence checking all impls of trait `{}`", tcx.def_path_str(def_id) }
    }
725

726 727 728 729 730 731 732
    /// Borrow-checks the function body. If this is a closure, returns
    /// additional requirements that the closure's creator must verify.
    query mir_borrowck(key: LocalDefId) -> &'tcx mir::BorrowCheckResult<'tcx> {
        desc { |tcx| "borrow-checking `{}`", tcx.def_path_str(key.to_def_id()) }
        cache_on_disk_if(tcx, opt_result) {
            tcx.is_closure(key.to_def_id())
                || opt_result.map_or(false, |r| !r.concrete_opaque_types.is_empty())
733
        }
734 735 736 737 738
    }
    query mir_borrowck_const_arg(key: (LocalDefId, DefId)) -> &'tcx mir::BorrowCheckResult<'tcx> {
        desc {
            |tcx| "borrow-checking the const argument`{}`",
            tcx.def_path_str(key.0.to_def_id())
739
        }
740
    }
741

742 743 744 745 746 747 748 749 750
    /// Gets a complete map from all types to their inherent impls.
    /// Not meant to be used directly outside of coherence.
    /// (Defined only for `LOCAL_CRATE`.)
    query crate_inherent_impls(k: CrateNum)
        -> CrateInherentImpls {
        storage(ArenaCacheSelector<'tcx>)
        eval_always
        desc { "all inherent impls defined in crate `{:?}`", k }
    }
751

752 753 754 755 756 757 758 759
    /// Checks all types in the crate for overlap in their inherent impls. Reports errors.
    /// Not meant to be used directly outside of coherence.
    /// (Defined only for `LOCAL_CRATE`.)
    query crate_inherent_impls_overlap_check(_: CrateNum)
        -> () {
        eval_always
        desc { "check for overlap between inherent impls defined in this crate" }
    }
760

761 762 763 764 765 766 767 768 769
    /// Check whether the function has any recursion that could cause the inliner to trigger
    /// a cycle. Returns the call stack causing the cycle. The call stack does not contain the
    /// current function, just all intermediate functions.
    query mir_callgraph_reachable(key: (ty::Instance<'tcx>, LocalDefId)) -> bool {
        fatal_cycle
        desc { |tcx|
            "computing if `{}` (transitively) calls `{}`",
            key.0,
            tcx.def_path_str(key.1.to_def_id()),
770
        }
771
    }
772

773 774 775 776 777 778
    /// Obtain all the calls into other local functions
    query mir_inliner_callees(key: ty::InstanceDef<'tcx>) -> &'tcx [(DefId, SubstsRef<'tcx>)] {
        fatal_cycle
        desc { |tcx|
            "computing all local function calls in `{}`",
            tcx.def_path_str(key.def_id()),
779
        }
780
    }
781

782 783 784 785 786 787 788 789
    /// Evaluates a constant and returns the computed allocation.
    ///
    /// **Do not use this** directly, use the `tcx.eval_static_initializer` wrapper.
    query eval_to_allocation_raw(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
        -> EvalToAllocationRawResult<'tcx> {
        desc { |tcx|
            "const-evaluating + checking `{}`",
            key.value.display(tcx)
790
        }
791 792
        cache_on_disk_if { true }
    }
793

794 795 796 797 798 799 800 801 802 803 804 805 806 807
    /// Evaluates const items or anonymous constants
    /// (such as enum variant explicit discriminants or array lengths)
    /// into a representation suitable for the type system and const generics.
    ///
    /// **Do not use this** directly, use one of the following wrappers: `tcx.const_eval_poly`,
    /// `tcx.const_eval_resolve`, `tcx.const_eval_instance`, or `tcx.const_eval_global_id`.
    query eval_to_const_value_raw(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
        -> EvalToConstValueResult<'tcx> {
        desc { |tcx|
            "simplifying constant for the type system `{}`",
            key.value.display(tcx)
        }
        cache_on_disk_if { true }
    }
808

O
Oli Scherer 已提交
809 810 811 812
    /// Convert an evaluated constant to a type level constant or
    /// return `None` if that is not possible.
    query const_to_valtree(
        key: ty::ParamEnvAnd<'tcx, ConstAlloc<'tcx>>
O
Oli Scherer 已提交
813
    ) -> Option<ty::ValTree<'tcx>> {
O
Oli Scherer 已提交
814 815 816
        desc { "destructure constant" }
    }

817 818 819 820 821 822 823
    /// Destructure a constant ADT or array into its variant index and its
    /// field values.
    query destructure_const(
        key: ty::ParamEnvAnd<'tcx, &'tcx ty::Const<'tcx>>
    ) -> mir::DestructuredConst<'tcx> {
        desc { "destructure constant" }
    }
824

825 826 827 828 829 830 831
    /// Dereference a constant reference or raw pointer and turn the result into a constant
    /// again.
    query deref_const(
        key: ty::ParamEnvAnd<'tcx, &'tcx ty::Const<'tcx>>
    ) -> &'tcx ty::Const<'tcx> {
        desc { "deref constant" }
    }
832

833 834 835
    query const_caller_location(key: (rustc_span::Symbol, u32, u32)) -> ConstValue<'tcx> {
        desc { "get a &core::panic::Location referring to a span" }
    }
836

837 838 839 840 841
    query lit_to_const(
        key: LitToConstInput<'tcx>
    ) -> Result<&'tcx ty::Const<'tcx>, LitToConstError> {
        desc { "converting literal to const" }
    }
842

843 844 845 846
    query check_match(key: DefId) {
        desc { |tcx| "match-checking `{}`", tcx.def_path_str(key) }
        cache_on_disk_if { key.is_local() }
    }
847

848 849 850 851 852 853 854 855 856
    /// Performs part of the privacy check and computes "access levels".
    query privacy_access_levels(_: CrateNum) -> &'tcx AccessLevels {
        eval_always
        desc { "privacy access levels" }
    }
    query check_private_in_public(_: CrateNum) -> () {
        eval_always
        desc { "checking for private elements in public interfaces" }
    }
857

858 859 860 861
    query reachable_set(_: CrateNum) -> FxHashSet<LocalDefId> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "reachability" }
    }
862

863 864 865 866 867
    /// Per-body `region::ScopeTree`. The `DefId` should be the owner `DefId` for the body;
    /// in the case of closures, this will be redirected to the enclosing function.
    query region_scope_tree(def_id: DefId) -> &'tcx region::ScopeTree {
        desc { |tcx| "computing drop scopes for `{}`", tcx.def_path_str(def_id) }
    }
868

869 870 871 872
    query mir_shims(key: ty::InstanceDef<'tcx>) -> mir::Body<'tcx> {
        storage(ArenaCacheSelector<'tcx>)
        desc { |tcx| "generating MIR shim for `{}`", tcx.def_path_str(key.def_id()) }
    }
873

874 875 876 877 878 879 880
    /// The `symbol_name` query provides the symbol name for calling a
    /// given instance from the local crate. In particular, it will also
    /// look up the correct symbol name of instances from upstream crates.
    query symbol_name(key: ty::Instance<'tcx>) -> ty::SymbolName<'tcx> {
        desc { "computing the symbol for `{}`", key }
        cache_on_disk_if { true }
    }
J
Joshua Nelson 已提交
881

882 883 884
    query opt_def_kind(def_id: DefId) -> Option<DefKind> {
        desc { |tcx| "looking up definition kind of `{}`", tcx.def_path_str(def_id) }
    }
J
Joshua Nelson 已提交
885

886 887 888 889 890 891 892 893 894
    query def_span(def_id: DefId) -> Span {
        desc { |tcx| "looking up span for `{}`", tcx.def_path_str(def_id) }
        // FIXME(mw): DefSpans are not really inputs since they are derived from
        // HIR. But at the moment HIR hashing still contains some hacks that allow
        // to make type debuginfo to be source location independent. Declaring
        // DefSpan an input makes sure that changes to these are always detected
        // regardless of HIR hashing.
        eval_always
    }
895

896 897 898
    query def_ident_span(def_id: DefId) -> Option<Span> {
        desc { |tcx| "looking up span for `{}`'s identifier", tcx.def_path_str(def_id) }
    }
899

900 901 902
    query lookup_stability(def_id: DefId) -> Option<&'tcx attr::Stability> {
        desc { |tcx| "looking up stability of `{}`", tcx.def_path_str(def_id) }
    }
903

904 905 906
    query lookup_const_stability(def_id: DefId) -> Option<&'tcx attr::ConstStability> {
        desc { |tcx| "looking up const stability of `{}`", tcx.def_path_str(def_id) }
    }
907

908 909 910
    query lookup_deprecation_entry(def_id: DefId) -> Option<DeprecationEntry> {
        desc { |tcx| "checking whether `{}` is deprecated", tcx.def_path_str(def_id) }
    }
911

912 913 914
    query item_attrs(def_id: DefId) -> &'tcx [ast::Attribute] {
        desc { |tcx| "collecting attributes of `{}`", tcx.def_path_str(def_id) }
    }
M
Matthew Jasper 已提交
915

916 917 918 919 920
    query codegen_fn_attrs(def_id: DefId) -> CodegenFnAttrs {
        desc { |tcx| "computing codegen attributes of `{}`", tcx.def_path_str(def_id) }
        storage(ArenaCacheSelector<'tcx>)
        cache_on_disk_if { true }
    }
921

922 923 924 925 926 927 928 929 930 931 932
    query fn_arg_names(def_id: DefId) -> &'tcx [rustc_span::symbol::Ident] {
        desc { |tcx| "looking up function parameter names for `{}`", tcx.def_path_str(def_id) }
    }
    /// Gets the rendered value of the specified constant or associated constant.
    /// Used by rustdoc.
    query rendered_const(def_id: DefId) -> String {
        desc { |tcx| "rendering constant intializer of `{}`", tcx.def_path_str(def_id) }
    }
    query impl_parent(def_id: DefId) -> Option<DefId> {
        desc { |tcx| "computing specialization parent impl of `{}`", tcx.def_path_str(def_id) }
    }
933

934 935 936 937 938
    /// Given an `associated_item`, find the trait it belongs to.
    /// Return `None` if the `DefId` is not an associated item.
    query trait_of_item(associated_item: DefId) -> Option<DefId> {
        desc { |tcx| "finding trait defining `{}`", tcx.def_path_str(associated_item) }
    }
939

940 941 942 943 944 945
    query is_ctfe_mir_available(key: DefId) -> bool {
        desc { |tcx| "checking if item has ctfe mir available: `{}`", tcx.def_path_str(key) }
    }
    query is_mir_available(key: DefId) -> bool {
        desc { |tcx| "checking if item has mir available: `{}`", tcx.def_path_str(key) }
    }
946

947 948 949 950
    query vtable_methods(key: ty::PolyTraitRef<'tcx>)
                        -> &'tcx [Option<(DefId, SubstsRef<'tcx>)>] {
        desc { |tcx| "finding all methods for trait {}", tcx.def_path_str(key.def_id()) }
    }
951

952 953 954 955 956 957 958
    query codegen_fulfill_obligation(
        key: (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>)
    ) -> Result<ImplSource<'tcx, ()>, ErrorReported> {
        cache_on_disk_if { true }
        desc { |tcx|
            "checking if `{}` fulfills its obligations",
            tcx.def_path_str(key.1.def_id())
959
        }
960
    }
961

962 963 964 965 966 967
    /// Return all `impl` blocks in the current crate.
    ///
    /// To allow caching this between crates, you must pass in [`LOCAL_CRATE`] as the crate number.
    /// Passing in any other crate will cause an ICE.
    ///
    /// [`LOCAL_CRATE`]: rustc_hir::def_id::LOCAL_CRATE
968
    query all_local_trait_impls(local_crate: CrateNum) -> &'tcx BTreeMap<DefId, Vec<LocalDefId>> {
969 970
        desc { "local trait impls" }
    }
971

972 973 974 975 976
    /// Given a trait `trait_id`, return all known `impl` blocks.
    query trait_impls_of(trait_id: DefId) -> ty::trait_def::TraitImpls {
        storage(ArenaCacheSelector<'tcx>)
        desc { |tcx| "trait impls of `{}`", tcx.def_path_str(trait_id) }
    }
977

978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995
    query specialization_graph_of(trait_id: DefId) -> specialization_graph::Graph {
        storage(ArenaCacheSelector<'tcx>)
        desc { |tcx| "building specialization graph of trait `{}`", tcx.def_path_str(trait_id) }
        cache_on_disk_if { true }
    }
    query object_safety_violations(trait_id: DefId) -> &'tcx [traits::ObjectSafetyViolation] {
        desc { |tcx| "determine object safety of trait `{}`", tcx.def_path_str(trait_id) }
    }

    /// Gets the ParameterEnvironment for a given item; this environment
    /// will be in "user-facing" mode, meaning that it is suitable for
    /// type-checking etc, and it does not normalize specializable
    /// associated types. This is almost always what you want,
    /// unless you are doing MIR optimizations, in which case you
    /// might want to use `reveal_all()` method to change modes.
    query param_env(def_id: DefId) -> ty::ParamEnv<'tcx> {
        desc { |tcx| "computing normalized predicates of `{}`", tcx.def_path_str(def_id) }
    }
996

997
    /// Like `param_env`, but returns the `ParamEnv` in `Reveal::All` mode.
998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
    /// Prefer this over `tcx.param_env(def_id).with_reveal_all_normalized(tcx)`,
    /// as this method is more efficient.
    query param_env_reveal_all_normalized(def_id: DefId) -> ty::ParamEnv<'tcx> {
        desc { |tcx| "computing revealed normalized predicates of `{}`", tcx.def_path_str(def_id) }
    }

    /// Trait selection queries. These are best used by invoking `ty.is_copy_modulo_regions()`,
    /// `ty.is_copy()`, etc, since that will prune the environment where possible.
    query is_copy_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
        desc { "computing whether `{}` is `Copy`", env.value }
    }
    /// Query backing `TyS::is_sized`.
    query is_sized_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
        desc { "computing whether `{}` is `Sized`", env.value }
    }
    /// Query backing `TyS::is_freeze`.
    query is_freeze_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
        desc { "computing whether `{}` is freeze", env.value }
    }
1017 1018 1019 1020
    /// Query backing `TyS::is_unpin`.
    query is_unpin_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
        desc { "computing whether `{}` is `Unpin`", env.value }
    }
1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033
    /// Query backing `TyS::needs_drop`.
    query needs_drop_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
        desc { "computing whether `{}` needs drop", env.value }
    }

    /// Query backing `TyS::is_structural_eq_shallow`.
    ///
    /// This is only correct for ADTs. Call `is_structural_eq_shallow` to handle all types
    /// correctly.
    query has_structural_eq_impls(ty: Ty<'tcx>) -> bool {
        desc {
            "computing whether `{:?}` implements `PartialStructuralEq` and `StructuralEq`",
            ty
1034
        }
1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
    }

    /// A list of types where the ADT requires drop if and only if any of
    /// those types require drop. If the ADT is known to always need drop
    /// then `Err(AlwaysRequiresDrop)` is returned.
    query adt_drop_tys(def_id: DefId) -> Result<&'tcx ty::List<Ty<'tcx>>, AlwaysRequiresDrop> {
        desc { |tcx| "computing when `{}` needs drop", tcx.def_path_str(def_id) }
        cache_on_disk_if { true }
    }

    query layout_raw(
        env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>
    ) -> Result<&'tcx rustc_target::abi::Layout, ty::layout::LayoutError<'tcx>> {
        desc { "computing layout of `{}`", env.value }
    }

    query dylib_dependency_formats(_: CrateNum)
                                    -> &'tcx [(CrateNum, LinkagePreference)] {
        desc { "dylib dependency formats of crate" }
    }

    query dependency_formats(_: CrateNum)
        -> Lrc<crate::middle::dependency_format::Dependencies>
    {
        desc { "get the linkage format of all dependencies" }
    }

    query is_compiler_builtins(_: CrateNum) -> bool {
        fatal_cycle
        desc { "checking if the crate is_compiler_builtins" }
    }
    query has_global_allocator(_: CrateNum) -> bool {
1067 1068
        // This query depends on untracked global state in CStore
        eval_always
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
        fatal_cycle
        desc { "checking if the crate has_global_allocator" }
    }
    query has_panic_handler(_: CrateNum) -> bool {
        fatal_cycle
        desc { "checking if the crate has_panic_handler" }
    }
    query is_profiler_runtime(_: CrateNum) -> bool {
        fatal_cycle
        desc { "query a crate is `#![profiler_runtime]`" }
    }
    query panic_strategy(_: CrateNum) -> PanicStrategy {
        fatal_cycle
        desc { "query a crate's configured panic strategy" }
    }
    query is_no_builtins(_: CrateNum) -> bool {
        fatal_cycle
        desc { "test whether a crate has `#![no_builtins]`" }
    }
    query symbol_mangling_version(_: CrateNum) -> SymbolManglingVersion {
        fatal_cycle
        desc { "query a crate's symbol mangling version" }
    }

    query extern_crate(def_id: DefId) -> Option<&'tcx ExternCrate> {
        eval_always
        desc { "getting crate's ExternCrateData" }
    }

    query specializes(_: (DefId, DefId)) -> bool {
        desc { "computing whether impls specialize one another" }
    }
    query in_scope_traits_map(_: LocalDefId)
        -> Option<&'tcx FxHashMap<ItemLocalId, StableVec<TraitCandidate>>> {
        eval_always
        desc { "traits in scope at a block" }
    }

    query module_exports(def_id: LocalDefId) -> Option<&'tcx [Export<LocalDefId>]> {
        desc { |tcx| "looking up items exported by `{}`", tcx.def_path_str(def_id.to_def_id()) }
        eval_always
    }

    query impl_defaultness(def_id: DefId) -> hir::Defaultness {
        desc { |tcx| "looking up whether `{}` is a default impl", tcx.def_path_str(def_id) }
    }

    query check_item_well_formed(key: LocalDefId) -> () {
        desc { |tcx| "checking that `{}` is well-formed", tcx.def_path_str(key.to_def_id()) }
    }
    query check_trait_item_well_formed(key: LocalDefId) -> () {
        desc { |tcx| "checking that `{}` is well-formed", tcx.def_path_str(key.to_def_id()) }
    }
    query check_impl_item_well_formed(key: LocalDefId) -> () {
        desc { |tcx| "checking that `{}` is well-formed", tcx.def_path_str(key.to_def_id()) }
    }

    // The `DefId`s of all non-generic functions and statics in the given crate
    // that can be reached from outside the crate.
    //
    // We expect this items to be available for being linked to.
    //
    // This query can also be called for `LOCAL_CRATE`. In this case it will
    // compute which items will be reachable to other crates, taking into account
    // the kind of crate that is currently compiled. Crates with only a
    // C interface have fewer reachable things.
    //
    // Does not include external symbols that don't have a corresponding DefId,
    // like the compiler-generated `main` function and so on.
    query reachable_non_generics(_: CrateNum)
        -> DefIdMap<SymbolExportLevel> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "looking up the exported symbols of a crate" }
    }
    query is_reachable_non_generic(def_id: DefId) -> bool {
        desc { |tcx| "checking whether `{}` is an exported symbol", tcx.def_path_str(def_id) }
    }
    query is_unreachable_local_definition(def_id: DefId) -> bool {
        desc { |tcx|
            "checking whether `{}` is reachable from outside the crate",
            tcx.def_path_str(def_id),
1150
        }
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
    }

    /// The entire set of monomorphizations the local crate can safely link
    /// to because they are exported from upstream crates. Do not depend on
    /// this directly, as its value changes anytime a monomorphization gets
    /// added or removed in any upstream crate. Instead use the narrower
    /// `upstream_monomorphizations_for`, `upstream_drop_glue_for`, or, even
    /// better, `Instance::upstream_monomorphization()`.
    query upstream_monomorphizations(
        k: CrateNum
    ) -> DefIdMap<FxHashMap<SubstsRef<'tcx>, CrateNum>> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "collecting available upstream monomorphizations `{:?}`", k }
    }

    /// Returns the set of upstream monomorphizations available for the
    /// generic function identified by the given `def_id`. The query makes
    /// sure to make a stable selection if the same monomorphization is
    /// available in multiple upstream crates.
    ///
    /// You likely want to call `Instance::upstream_monomorphization()`
    /// instead of invoking this query directly.
    query upstream_monomorphizations_for(def_id: DefId)
        -> Option<&'tcx FxHashMap<SubstsRef<'tcx>, CrateNum>> {
1175
            desc { |tcx|
1176
                "collecting available upstream monomorphizations for `{}`",
1177 1178 1179
                tcx.def_path_str(def_id),
            }
        }
1180

1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198
    /// Returns the upstream crate that exports drop-glue for the given
    /// type (`substs` is expected to be a single-item list containing the
    /// type one wants drop-glue for).
    ///
    /// This is a subset of `upstream_monomorphizations_for` in order to
    /// increase dep-tracking granularity. Otherwise adding or removing any
    /// type with drop-glue in any upstream crate would invalidate all
    /// functions calling drop-glue of an upstream type.
    ///
    /// You likely want to call `Instance::upstream_monomorphization()`
    /// instead of invoking this query directly.
    ///
    /// NOTE: This query could easily be extended to also support other
    ///       common functions that have are large set of monomorphizations
    ///       (like `Clone::clone` for example).
    query upstream_drop_glue_for(substs: SubstsRef<'tcx>) -> Option<CrateNum> {
        desc { "available upstream drop-glue for `{:?}`", substs }
    }
1199

1200 1201 1202
    query foreign_modules(_: CrateNum) -> Lrc<FxHashMap<DefId, ForeignModule>> {
        desc { "looking up the foreign modules of a linked crate" }
    }
1203

1204 1205
    /// Identifies the entry-point (e.g., the `main` function) for a given
    /// crate, returning `None` if there is no entry point (such as for library crates).
1206
    query entry_fn(_: CrateNum) -> Option<(DefId, EntryFnType)> {
1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240
        desc { "looking up the entry function of a crate" }
    }
    query plugin_registrar_fn(_: CrateNum) -> Option<DefId> {
        desc { "looking up the plugin registrar for a crate" }
    }
    query proc_macro_decls_static(_: CrateNum) -> Option<DefId> {
        desc { "looking up the derive registrar for a crate" }
    }
    query crate_disambiguator(_: CrateNum) -> CrateDisambiguator {
        eval_always
        desc { "looking up the disambiguator a crate" }
    }
    // The macro which defines `rustc_metadata::provide_extern` depends on this query's name.
    // Changing the name should cause a compiler error, but in case that changes, be aware.
    query crate_hash(_: CrateNum) -> Svh {
        eval_always
        desc { "looking up the hash a crate" }
    }
    query crate_host_hash(_: CrateNum) -> Option<Svh> {
        eval_always
        desc { "looking up the hash of a host version of a crate" }
    }
    query original_crate_name(_: CrateNum) -> Symbol {
        eval_always
        desc { "looking up the original name a crate" }
    }
    query extra_filename(_: CrateNum) -> String {
        eval_always
        desc { "looking up the extra filename for a crate" }
    }
    query crate_extern_paths(_: CrateNum) -> Vec<PathBuf> {
        eval_always
        desc { "looking up the paths for extern crates" }
    }
1241

1242 1243 1244 1245 1246 1247
    /// Given a crate and a trait, look up all impls of that trait in the crate.
    /// Return `(impl_id, self_ty)`.
    query implementations_of_trait(_: (CrateNum, DefId))
        -> &'tcx [(DefId, Option<ty::fast_reject::SimplifiedType>)] {
        desc { "looking up implementations of a trait in a crate" }
    }
J
Joshua Nelson 已提交
1248

1249 1250 1251 1252 1253 1254
    /// Given a crate, look up all trait impls in that crate.
    /// Return `(impl_id, self_ty)`.
    query all_trait_implementations(_: CrateNum)
        -> &'tcx [(DefId, Option<ty::fast_reject::SimplifiedType>)] {
        desc { "looking up all (?) trait implementations" }
    }
1255

1256 1257 1258 1259 1260 1261 1262 1263 1264 1265
    query is_dllimport_foreign_item(def_id: DefId) -> bool {
        desc { |tcx| "is_dllimport_foreign_item({})", tcx.def_path_str(def_id) }
    }
    query is_statically_included_foreign_item(def_id: DefId) -> bool {
        desc { |tcx| "is_statically_included_foreign_item({})", tcx.def_path_str(def_id) }
    }
    query native_library_kind(def_id: DefId)
        -> Option<NativeLibKind> {
        desc { |tcx| "native_library_kind({})", tcx.def_path_str(def_id) }
    }
1266

J
Jack Huey 已提交
1267 1268 1269 1270 1271 1272
    /// Does lifetime resolution, but does not descend into trait items. This
    /// should only be used for resolving lifetimes of on trait definitions,
    /// and is used to avoid cycles. Importantly, `resolve_lifetimes` still visits
    /// the same lifetimes and is responsible for diagnostics.
    /// See `rustc_resolve::late::lifetimes for details.
    query resolve_lifetimes_trait_definition(_: LocalDefId) -> ResolveLifetimes {
J
Jack Huey 已提交
1273
        storage(ArenaCacheSelector<'tcx>)
J
Jack Huey 已提交
1274
        desc { "resolving lifetimes for a trait definition" }
J
Jack Huey 已提交
1275
    }
J
Jack Huey 已提交
1276 1277 1278
    /// Does lifetime resolution on items. Importantly, we can't resolve
    /// lifetimes directly on things like trait methods, because of trait params.
    /// See `rustc_resolve::late::lifetimes for details.
J
Jack Huey 已提交
1279
    query resolve_lifetimes(_: LocalDefId) -> ResolveLifetimes {
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290
        storage(ArenaCacheSelector<'tcx>)
        desc { "resolving lifetimes" }
    }
    query named_region_map(_: LocalDefId) ->
        Option<&'tcx FxHashMap<ItemLocalId, Region>> {
        desc { "looking up a named region" }
    }
    query is_late_bound_map(_: LocalDefId) ->
        Option<(LocalDefId, &'tcx FxHashSet<ItemLocalId>)> {
        desc { "testing if a region is late bound" }
    }
J
Jack Huey 已提交
1291
    /// For a given item (like a struct), gets the default lifetimes to be used
K
klensy 已提交
1292
    /// for each parameter if a trait object were to be passed for that parameter.
J
Jack Huey 已提交
1293 1294
    /// For example, for `struct Foo<'a, T, U>`, this would be `['static, 'static]`.
    /// For `struct Foo<'a, T: 'a, U>`, this would instead be `['a, 'static]`.
1295
    query object_lifetime_defaults_map(_: LocalDefId)
J
Jack Huey 已提交
1296 1297
        -> Option<Vec<ObjectLifetimeDefault>> {
        desc { "looking up lifetime defaults for a region on an item" }
1298
    }
1299 1300 1301 1302
    query late_bound_vars_map(_: LocalDefId)
        -> Option<&'tcx FxHashMap<ItemLocalId, Vec<ty::BoundVariableKind>>> {
        desc { "looking up late bound vars" }
    }
1303

B
b-naber 已提交
1304 1305 1306 1307
    query lifetime_scope_map(_: LocalDefId) -> Option<FxHashMap<ItemLocalId, LifetimeScopeForPath>> {
        desc { "finds the lifetime scope for an HirId of a PathSegment" }
    }

1308 1309 1310 1311
    query visibility(def_id: DefId) -> ty::Visibility {
        eval_always
        desc { |tcx| "computing visibility of `{}`", tcx.def_path_str(def_id) }
    }
N
Nadrieril 已提交
1312

1313 1314 1315 1316 1317 1318 1319 1320
    /// Computes the set of modules from which this type is visibly uninhabited.
    /// To check whether a type is uninhabited at all (not just from a given module), you could
    /// check whether the forest is empty.
    query type_uninhabited_from(
        key: ty::ParamEnvAnd<'tcx, Ty<'tcx>>
    ) -> ty::inhabitedness::DefIdForest {
        desc { "computing the inhabitedness of `{:?}`", key }
    }
1321

1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333
    query dep_kind(_: CrateNum) -> CrateDepKind {
        eval_always
        desc { "fetching what a dependency looks like" }
    }
    query crate_name(_: CrateNum) -> Symbol {
        eval_always
        desc { "fetching what a crate is named" }
    }
    query item_children(def_id: DefId) -> &'tcx [Export<hir::HirId>] {
        desc { |tcx| "collecting child items of `{}`", tcx.def_path_str(def_id) }
    }
    query extern_mod_stmt_cnum(def_id: LocalDefId) -> Option<CrateNum> {
1334 1335
        // This depends on untracked global state (`tcx.extern_crate_map`)
        eval_always
1336 1337
        desc { |tcx| "computing crate imported by `{}`", tcx.def_path_str(def_id.to_def_id()) }
    }
1338

1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
    query get_lib_features(_: CrateNum) -> LibFeatures {
        storage(ArenaCacheSelector<'tcx>)
        eval_always
        desc { "calculating the lib features map" }
    }
    query defined_lib_features(_: CrateNum)
        -> &'tcx [(Symbol, Option<Symbol>)] {
        desc { "calculating the lib features defined in a crate" }
    }
    /// Returns the lang items defined in another crate by loading it from metadata.
    // FIXME: It is illegal to pass a `CrateNum` other than `LOCAL_CRATE` here, just get rid
    // of that argument?
    query get_lang_items(_: CrateNum) -> LanguageItems {
        storage(ArenaCacheSelector<'tcx>)
        eval_always
        desc { "calculating the lang items map" }
    }
O
Oliver Scherer 已提交
1356

1357 1358 1359 1360 1361 1362
    /// Returns all diagnostic items defined in all crates.
    query all_diagnostic_items(_: CrateNum) -> FxHashMap<Symbol, DefId> {
        storage(ArenaCacheSelector<'tcx>)
        eval_always
        desc { "calculating the diagnostic items map" }
    }
O
Oliver Scherer 已提交
1363

1364 1365 1366 1367
    /// Returns the lang items defined in another crate by loading it from metadata.
    query defined_lang_items(_: CrateNum) -> &'tcx [(DefId, usize)] {
        desc { "calculating the lang items defined in a crate" }
    }
O
Oliver Scherer 已提交
1368

1369 1370 1371 1372 1373
    /// Returns the diagnostic items defined in a crate.
    query diagnostic_items(_: CrateNum) -> FxHashMap<Symbol, DefId> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "calculating the diagnostic items map in a crate" }
    }
O
Oliver Scherer 已提交
1374

1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
    query missing_lang_items(_: CrateNum) -> &'tcx [LangItem] {
        desc { "calculating the missing lang items in a crate" }
    }
    query visible_parent_map(_: CrateNum)
        -> DefIdMap<DefId> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "calculating the visible parent map" }
    }
    query trimmed_def_paths(_: CrateNum)
        -> FxHashMap<DefId, Symbol> {
        storage(ArenaCacheSelector<'tcx>)
        desc { "calculating trimmed def paths" }
    }
    query missing_extern_crate_item(_: CrateNum) -> bool {
        eval_always
        desc { "seeing if we're missing an `extern crate` item for this crate" }
    }
    query used_crate_source(_: CrateNum) -> Lrc<CrateSource> {
        eval_always
        desc { "looking at the source for a crate" }
    }
    query postorder_cnums(_: CrateNum) -> &'tcx [CrateNum] {
        eval_always
        desc { "generating a postorder list of CrateNums" }
    }
1400

1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418
    query upvars_mentioned(def_id: DefId) -> Option<&'tcx FxIndexMap<hir::HirId, hir::Upvar>> {
        desc { |tcx| "collecting upvars mentioned in `{}`", tcx.def_path_str(def_id) }
        eval_always
    }
    query maybe_unused_trait_import(def_id: LocalDefId) -> bool {
        eval_always
        desc { |tcx| "maybe_unused_trait_import for `{}`", tcx.def_path_str(def_id.to_def_id()) }
    }
    query maybe_unused_extern_crates(_: CrateNum)
        -> &'tcx [(LocalDefId, Span)] {
        eval_always
        desc { "looking up all possibly unused extern crates" }
    }
    query names_imported_by_glob_use(def_id: LocalDefId)
        -> &'tcx FxHashSet<Symbol> {
        eval_always
        desc { |tcx| "names_imported_by_glob_use for `{}`", tcx.def_path_str(def_id.to_def_id()) }
    }
1419

1420 1421 1422 1423 1424 1425 1426 1427 1428
    query stability_index(_: CrateNum) -> stability::Index<'tcx> {
        storage(ArenaCacheSelector<'tcx>)
        eval_always
        desc { "calculating the stability index for the local crate" }
    }
    query all_crate_nums(_: CrateNum) -> &'tcx [CrateNum] {
        eval_always
        desc { "fetching all foreign CrateNum instances" }
    }
1429

1430 1431 1432 1433 1434 1435
    /// A vector of every trait accessible in the whole crate
    /// (i.e., including those from subcrates). This is used only for
    /// error reporting.
    query all_traits(_: CrateNum) -> &'tcx [DefId] {
        desc { "fetching all foreign and local traits" }
    }
1436

1437 1438 1439 1440 1441 1442 1443 1444 1445
    /// The list of symbols exported from the given crate.
    ///
    /// - All names contained in `exported_symbols(cnum)` are guaranteed to
    ///   correspond to a publicly visible symbol in `cnum` machine code.
    /// - The `exported_symbols` sets of different crates do not intersect.
    query exported_symbols(_: CrateNum)
        -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportLevel)] {
        desc { "exported_symbols" }
    }
1446

1447 1448 1449 1450 1451 1452 1453 1454
    query collect_and_partition_mono_items(_: CrateNum)
        -> (&'tcx DefIdSet, &'tcx [CodegenUnit<'tcx>]) {
        eval_always
        desc { "collect_and_partition_mono_items" }
    }
    query is_codegened_item(def_id: DefId) -> bool {
        desc { |tcx| "determining whether `{}` needs codegen", tcx.def_path_str(def_id) }
    }
1455 1456 1457 1458 1459 1460 1461 1462

    /// All items participating in code generation together with items inlined into them.
    query codegened_and_inlined_items(_: CrateNum)
        -> &'tcx DefIdSet {
        eval_always
       desc { "codegened_and_inlined_items" }
    }

1463 1464 1465 1466 1467 1468 1469 1470
    query codegen_unit(_: Symbol) -> &'tcx CodegenUnit<'tcx> {
        desc { "codegen_unit" }
    }
    query unused_generic_params(key: DefId) -> FiniteBitSet<u32> {
        cache_on_disk_if { key.is_local() }
        desc {
            |tcx| "determining which generic parameters are unused by `{}`",
                tcx.def_path_str(key)
1471
        }
1472 1473 1474 1475
    }
    query backend_optimization_level(_: CrateNum) -> OptLevel {
        desc { "optimization level used by backend" }
    }
1476

1477 1478 1479 1480
    query output_filenames(_: CrateNum) -> Arc<OutputFilenames> {
        eval_always
        desc { "output_filenames" }
    }
1481

1482 1483 1484 1485 1486 1487 1488 1489 1490
    /// Do not call this query directly: invoke `normalize` instead.
    query normalize_projection_ty(
        goal: CanonicalProjectionGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, NormalizationResult<'tcx>>>,
        NoSolution,
    > {
        desc { "normalizing `{:?}`", goal }
    }
1491

1492 1493 1494 1495 1496 1497
    /// Do not call this query directly: invoke `normalize_erasing_regions` instead.
    query normalize_generic_arg_after_erasing_regions(
        goal: ParamEnvAnd<'tcx, GenericArg<'tcx>>
    ) -> GenericArg<'tcx> {
        desc { "normalizing `{}`", goal.value }
    }
1498

1499 1500 1501 1502 1503 1504 1505
    /// Do not call this query directly: invoke `normalize_erasing_regions` instead.
    query normalize_mir_const_after_erasing_regions(
        goal: ParamEnvAnd<'tcx, mir::ConstantKind<'tcx>>
    ) -> mir::ConstantKind<'tcx> {
        desc { "normalizing `{}`", goal.value }
    }

1506 1507 1508 1509 1510 1511 1512 1513
    query implied_outlives_bounds(
        goal: CanonicalTyGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, Vec<OutlivesBound<'tcx>>>>,
        NoSolution,
    > {
        desc { "computing implied outlives bounds for `{:?}`", goal }
    }
1514

1515 1516 1517 1518 1519 1520 1521 1522 1523
    /// Do not call this query directly: invoke `infcx.at().dropck_outlives()` instead.
    query dropck_outlives(
        goal: CanonicalTyGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, DropckOutlivesResult<'tcx>>>,
        NoSolution,
    > {
        desc { "computing dropck types for `{:?}`", goal }
    }
1524

1525 1526 1527 1528 1529 1530 1531
    /// Do not call this query directly: invoke `infcx.predicate_may_hold()` or
    /// `infcx.predicate_must_hold()` instead.
    query evaluate_obligation(
        goal: CanonicalPredicateGoal<'tcx>
    ) -> Result<traits::EvaluationResult, traits::OverflowError> {
        desc { "evaluating trait selection obligation `{}`", goal.value.value }
    }
1532

1533 1534 1535 1536 1537 1538 1539 1540
    query evaluate_goal(
        goal: traits::CanonicalChalkEnvironmentAndGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ()>>,
        NoSolution
    > {
        desc { "evaluating trait selection obligation `{}`", goal.value }
    }
J
Jack Huey 已提交
1541

1542 1543 1544 1545 1546
    query type_implements_trait(
        key: (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>, )
    ) -> bool {
        desc { "evaluating `type_implements_trait` `{:?}`", key }
    }
C
csmoe 已提交
1547

1548 1549 1550 1551 1552 1553 1554 1555 1556
    /// Do not call this query directly: part of the `Eq` type-op
    query type_op_ascribe_user_type(
        goal: CanonicalTypeOpAscribeUserTypeGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ()>>,
        NoSolution,
    > {
        desc { "evaluating `type_op_ascribe_user_type` `{:?}`", goal }
    }
1557

1558 1559 1560 1561 1562 1563 1564 1565 1566
    /// Do not call this query directly: part of the `Eq` type-op
    query type_op_eq(
        goal: CanonicalTypeOpEqGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ()>>,
        NoSolution,
    > {
        desc { "evaluating `type_op_eq` `{:?}`", goal }
    }
1567

1568 1569 1570 1571 1572 1573 1574 1575 1576
    /// Do not call this query directly: part of the `Subtype` type-op
    query type_op_subtype(
        goal: CanonicalTypeOpSubtypeGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ()>>,
        NoSolution,
    > {
        desc { "evaluating `type_op_subtype` `{:?}`", goal }
    }
1577

1578 1579 1580 1581 1582 1583 1584 1585 1586
    /// Do not call this query directly: part of the `ProvePredicate` type-op
    query type_op_prove_predicate(
        goal: CanonicalTypeOpProvePredicateGoal<'tcx>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ()>>,
        NoSolution,
    > {
        desc { "evaluating `type_op_prove_predicate` `{:?}`", goal }
    }
1587

1588 1589 1590 1591 1592 1593 1594 1595 1596
    /// Do not call this query directly: part of the `Normalize` type-op
    query type_op_normalize_ty(
        goal: CanonicalTypeOpNormalizeGoal<'tcx, Ty<'tcx>>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, Ty<'tcx>>>,
        NoSolution,
    > {
        desc { "normalizing `{:?}`", goal }
    }
1597

1598 1599 1600 1601 1602 1603 1604 1605 1606
    /// Do not call this query directly: part of the `Normalize` type-op
    query type_op_normalize_predicate(
        goal: CanonicalTypeOpNormalizeGoal<'tcx, ty::Predicate<'tcx>>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ty::Predicate<'tcx>>>,
        NoSolution,
    > {
        desc { "normalizing `{:?}`", goal }
    }
1607

1608 1609 1610 1611 1612 1613 1614 1615 1616
    /// Do not call this query directly: part of the `Normalize` type-op
    query type_op_normalize_poly_fn_sig(
        goal: CanonicalTypeOpNormalizeGoal<'tcx, ty::PolyFnSig<'tcx>>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ty::PolyFnSig<'tcx>>>,
        NoSolution,
    > {
        desc { "normalizing `{:?}`", goal }
    }
1617

1618 1619 1620 1621 1622 1623 1624 1625 1626
    /// Do not call this query directly: part of the `Normalize` type-op
    query type_op_normalize_fn_sig(
        goal: CanonicalTypeOpNormalizeGoal<'tcx, ty::FnSig<'tcx>>
    ) -> Result<
        &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, ty::FnSig<'tcx>>>,
        NoSolution,
    > {
        desc { "normalizing `{:?}`", goal }
    }
1627

1628 1629 1630 1631
    query subst_and_check_impossible_predicates(key: (DefId, SubstsRef<'tcx>)) -> bool {
        desc { |tcx|
            "impossible substituted predicates:`{}`",
            tcx.def_path_str(key.0)
1632
        }
1633
    }
1634

1635 1636 1637 1638 1639
    query method_autoderef_steps(
        goal: CanonicalTyGoal<'tcx>
    ) -> MethodAutoderefStepsResult<'tcx> {
        desc { "computing autoderef types for `{:?}`", goal }
    }
1640

1641 1642 1643 1644 1645
    query supported_target_features(_: CrateNum) -> FxHashMap<String, Option<Symbol>> {
        storage(ArenaCacheSelector<'tcx>)
        eval_always
        desc { "looking up supported target features" }
    }
1646

1647 1648 1649 1650 1651
    /// Get an estimate of the size of an InstanceDef based on its MIR for CGU partitioning.
    query instance_def_size_estimate(def: ty::InstanceDef<'tcx>)
        -> usize {
        desc { |tcx| "estimating size for `{}`", tcx.def_path_str(def.def_id()) }
    }
1652

1653 1654 1655 1656
    query features_query(_: CrateNum) -> &'tcx rustc_feature::Features {
        eval_always
        desc { "looking up enabled feature gates" }
    }
A
Aaron Hill 已提交
1657

1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671
    /// Attempt to resolve the given `DefId` to an `Instance`, for the
    /// given generics args (`SubstsRef`), returning one of:
    ///  * `Ok(Some(instance))` on success
    ///  * `Ok(None)` when the `SubstsRef` are still too generic,
    ///    and therefore don't allow finding the final `Instance`
    ///  * `Err(ErrorReported)` when the `Instance` resolution process
    ///    couldn't complete due to errors elsewhere - this is distinct
    ///    from `Ok(None)` to avoid misleading diagnostics when an error
    ///    has already been/will be emitted, for the original cause
    query resolve_instance(
        key: ty::ParamEnvAnd<'tcx, (DefId, SubstsRef<'tcx>)>
    ) -> Result<Option<ty::Instance<'tcx>>, ErrorReported> {
        desc { "resolving instance `{}`", ty::Instance::new(key.value.0, key.value.1) }
    }
B
Bastian Kauschke 已提交
1672

1673 1674 1675 1676 1677 1678
    query resolve_instance_of_const_arg(
        key: ty::ParamEnvAnd<'tcx, (LocalDefId, DefId, SubstsRef<'tcx>)>
    ) -> Result<Option<ty::Instance<'tcx>>, ErrorReported> {
        desc {
            "resolving instance of the const argument `{}`",
            ty::Instance::new(key.value.0.to_def_id(), key.value.2),
B
Bastian Kauschke 已提交
1679
        }
1680
    }
1681

1682 1683 1684
    query normalize_opaque_types(key: &'tcx ty::List<ty::Predicate<'tcx>>) -> &'tcx ty::List<ty::Predicate<'tcx>> {
        desc { "normalizing opaque types in {:?}", key }
    }
E
yeet  
Ellen 已提交
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694

    /// Checks whether a type is definitely uninhabited. This is
    /// conservative: for some types that are uninhabited we return `false`,
    /// but we only return `true` for types that are definitely uninhabited.
    /// `ty.conservative_is_privately_uninhabited` implies that any value of type `ty`
    /// will be `Abi::Uninhabited`. (Note that uninhabited types may have nonzero
    /// size, to account for partial initialisation. See #49298 for details.)
    query conservative_is_privately_uninhabited(key: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
        desc { "conservatively checking if {:?} is privately uninhabited", key }
    }
1695
}