]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_middle/src/ty/mod.rs
New upstream version 1.56.0+dfsg1
[rustc.git] / compiler / rustc_middle / src / ty / mod.rs
CommitLineData
fc512014
XL
1//! Defines how the compiler represents types internally.
2//!
3//! Two important entities in this module are:
4//!
5//! - [`rustc_middle::ty::Ty`], used to represent the semantics of a type.
6//! - [`rustc_middle::ty::TyCtxt`], the central data structure in the compiler.
7//!
8//! For more information, see ["The `ty` module: representing types"] in the ructc-dev-guide.
9//!
10//! ["The `ty` module: representing types"]: https://rustc-dev-guide.rust-lang.org/ty.html
11
3dfed10e 12pub use self::fold::{TypeFoldable, TypeFolder, TypeVisitor};
dc9dc135 13pub use self::AssocItemContainer::*;
e9174d1e 14pub use self::BorrowKind::*;
e9174d1e 15pub use self::IntVarValue::*;
dfeec247 16pub use self::Variance::*;
6a06907d
XL
17pub use adt::*;
18pub use assoc::*;
6a06907d 19pub use generics::*;
136023e0 20pub use vtable::*;
dfeec247 21
dfeec247 22use crate::hir::exports::ExportMap;
9fa01778 23use crate::ich::StableHashingContext;
e74abb32 24use crate::middle::cstore::CrateStoreDyn;
6a06907d 25use crate::mir::{Body, GeneratorLayout};
9fa01778
XL
26use crate::traits::{self, Reveal};
27use crate::ty;
f035d41b 28use crate::ty::subst::{GenericArg, InternalSubsts, Subst, SubstsRef};
6a06907d 29use crate::ty::util::Discr;
3dfed10e 30use rustc_ast as ast;
74b04a01 31use rustc_attr as attr;
dfeec247 32use rustc_data_structures::captures::Captures;
6a06907d 33use rustc_data_structures::fx::{FxHashMap, FxHashSet};
dfeec247 34use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
ba9703b0 35use rustc_data_structures::sync::{self, par_iter, ParallelIterator};
3dfed10e 36use rustc_data_structures::tagged_ptr::CopyTaggedPtr;
dfeec247 37use rustc_hir as hir;
6a06907d 38use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
17df50a5 39use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap, CRATE_DEF_INDEX};
94222f64 40use rustc_hir::Node;
dfeec247 41use rustc_macros::HashStable;
6a06907d 42use rustc_span::symbol::{kw, Ident, Symbol};
dfeec247 43use rustc_span::Span;
6a06907d 44use rustc_target::abi::Align;
74b04a01 45
f9f354fc 46use std::cmp::Ordering;
94222f64 47use std::collections::BTreeMap;
e9174d1e 48use std::hash::{Hash, Hasher};
6a06907d
XL
49use std::ops::ControlFlow;
50use std::{fmt, ptr, str};
54a0048b 51
60c5eb7d 52pub use crate::ty::diagnostics::*;
5869c6ff
XL
53pub use rustc_type_ir::InferTy::*;
54pub use rustc_type_ir::*;
e9174d1e 55
3b2f2976
XL
56pub use self::binding::BindingMode;
57pub use self::binding::BindingMode::*;
94222f64
XL
58pub use self::closure::{
59 is_ancestor_or_same_capture, place_to_string_for_capture, BorrowKind, CaptureInfo,
60 CapturedPlace, ClosureKind, MinCaptureInformationMap, MinCaptureList,
61 RootVariableMinCaptureList, UpvarBorrow, UpvarCapture, UpvarCaptureMap, UpvarId, UpvarListMap,
62 UpvarPath, CAPTURE_STRUCT_LOCAL,
63};
cdc7bbd5 64pub use self::consts::{Const, ConstInt, ConstKind, InferConst, ScalarInt, Unevaluated, ValTree};
0731742a 65pub use self::context::{
6a06907d
XL
66 tls, CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations,
67 CtxtInterners, DelaySpanBugEmitted, FreeRegionInfo, GeneratorInteriorTypeCause, GlobalCtxt,
136023e0 68 Lift, OnDiskCache, TyCtxt, TypeckResults, UserType, UserTypeAnnotationIndex,
0731742a 69};
cc61c64b 70pub use self::instance::{Instance, InstanceDef};
f9f354fc 71pub use self::list::List;
6a06907d
XL
72pub use self::sty::BoundRegionKind::*;
73pub use self::sty::RegionKind::*;
74pub use self::sty::TyKind::*;
75pub use self::sty::{
cdc7bbd5
XL
76 Binder, BoundRegion, BoundRegionKind, BoundTy, BoundTyKind, BoundVar, BoundVariableKind,
77 CanonicalPolyFnSig, ClosureSubsts, ClosureSubstsParts, ConstVid, EarlyBoundRegion,
78 ExistentialPredicate, ExistentialProjection, ExistentialTraitRef, FnSig, FreeRegion, GenSig,
79 GeneratorSubsts, GeneratorSubstsParts, ParamConst, ParamTy, PolyExistentialProjection,
80 PolyExistentialTraitRef, PolyFnSig, PolyGenSig, PolyTraitRef, ProjectionTy, Region, RegionKind,
17df50a5 81 RegionVid, TraitRef, TyKind, TypeAndMut, UpvarSubsts, VarianceDiagInfo, VarianceDiagMutKind,
6a06907d 82};
7cac9316 83pub use self::trait_def::TraitDef;
9cc50fc6 84
3dfed10e 85pub mod _match;
e9174d1e 86pub mod adjustment;
3b2f2976 87pub mod binding;
e9174d1e 88pub mod cast;
abe05a73 89pub mod codec;
dfeec247 90pub mod error;
e9174d1e 91pub mod fast_reject;
48663c56 92pub mod flags;
e9174d1e 93pub mod fold;
32a655c1 94pub mod inhabitedness;
54a0048b 95pub mod layout;
dfeec247 96pub mod normalize_erasing_regions;
e9174d1e 97pub mod outlives;
532ac7d7 98pub mod print;
94b46f34 99pub mod query;
e9174d1e 100pub mod relate;
54a0048b 101pub mod subst;
9cc50fc6 102pub mod trait_def;
e9174d1e 103pub mod util;
136023e0 104pub mod vtable;
dfeec247 105pub mod walk;
e9174d1e 106
6a06907d
XL
107mod adt;
108mod assoc;
109mod closure;
f035d41b 110mod consts;
e9174d1e 111mod context;
dfeec247 112mod diagnostics;
6a06907d
XL
113mod erase_regions;
114mod generics;
cc61c64b 115mod instance;
f9f354fc 116mod list;
e9174d1e
SL
117mod structural_impls;
118mod sty;
119
e9174d1e
SL
120// Data types
121
136023e0 122#[derive(Debug)]
e74abb32 123pub struct ResolverOutputs {
ba9703b0 124 pub definitions: rustc_hir::definitions::Definitions,
e74abb32 125 pub cstore: Box<CrateStoreDyn>,
29967ef6 126 pub visibilities: FxHashMap<LocalDefId, Visibility>,
f9f354fc 127 pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
f9f354fc
XL
128 pub maybe_unused_trait_imports: FxHashSet<LocalDefId>,
129 pub maybe_unused_extern_crates: Vec<(LocalDefId, Span)>,
f035d41b 130 pub export_map: ExportMap<LocalDefId>,
f9f354fc 131 pub glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
0bf4aa26
XL
132 /// Extern prelude entries. The value is `true` if the entry was introduced
133 /// via `extern crate` item and not `--extern` option or compiler built-in.
f9f354fc 134 pub extern_prelude: FxHashMap<Symbol, bool>,
cdc7bbd5 135 pub main_def: Option<MainDefinition>,
94222f64
XL
136 pub trait_impls: BTreeMap<DefId, Vec<LocalDefId>>,
137 /// A list of proc macro LocalDefIds, written out in the order in which
138 /// they are declared in the static array generated by proc_macro_harness.
139 pub proc_macros: Vec<LocalDefId>,
cdc7bbd5
XL
140}
141
136023e0 142#[derive(Clone, Copy, Debug)]
cdc7bbd5
XL
143pub struct MainDefinition {
144 pub res: Res<ast::NodeId>,
145 pub is_import: bool,
146 pub span: Span,
147}
148
149impl MainDefinition {
150 pub fn opt_fn_def_id(self) -> Option<DefId> {
151 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
152 }
e9174d1e
SL
153}
154
54a0048b
SL
155/// The "header" of an impl is everything outside the body: a Self type, a trait
156/// ref (in the case of a trait impl), and a set of predicates (from the
9fa01778 157/// bounds / where-clauses).
60c5eb7d 158#[derive(Clone, Debug, TypeFoldable)]
54a0048b
SL
159pub struct ImplHeader<'tcx> {
160 pub impl_def_id: DefId,
161 pub self_ty: Ty<'tcx>,
162 pub trait_ref: Option<TraitRef<'tcx>>,
163 pub predicates: Vec<Predicate<'tcx>>,
164}
165
5869c6ff 166#[derive(Copy, Clone, PartialEq, TyEncodable, TyDecodable, HashStable, Debug)]
e74abb32
XL
167pub enum ImplPolarity {
168 /// `impl Trait for Type`
169 Positive,
170 /// `impl !Trait for Type`
171 Negative,
172 /// `#[rustc_reservation_impl] impl Trait for Type`
173 ///
174 /// This is a "stability hack", not a real Rust feature.
175 /// See #64631 for details.
176 Reservation,
177}
178
3dfed10e 179#[derive(Clone, Debug, PartialEq, Eq, Copy, Hash, TyEncodable, TyDecodable, HashStable)]
54a0048b
SL
180pub enum Visibility {
181 /// Visible everywhere (including in other crates).
182 Public,
183 /// Visible only in the given crate-local module.
32a655c1 184 Restricted(DefId),
54a0048b 185 /// Not visible anywhere in the local crate. This is the visibility of private external items.
32a655c1 186 Invisible,
54a0048b
SL
187}
188
94222f64
XL
189#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, HashStable, TyEncodable, TyDecodable)]
190pub enum BoundConstness {
191 /// `T: Trait`
192 NotConst,
193 /// `T: ~const Trait`
194 ///
195 /// Requires resolving to const only when we are in a const context.
196 ConstIfConst,
197}
198
199impl fmt::Display for BoundConstness {
200 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
201 match self {
202 Self::NotConst => f.write_str("normal"),
203 Self::ConstIfConst => f.write_str("`~const`"),
204 }
205 }
206}
207
136023e0
XL
208#[derive(
209 Clone,
210 Debug,
211 PartialEq,
212 Eq,
213 Copy,
214 Hash,
215 TyEncodable,
216 TyDecodable,
217 HashStable,
218 TypeFoldable
219)]
220pub struct ClosureSizeProfileData<'tcx> {
221 /// Tuple containing the types of closure captures before the feature `capture_disjoint_fields`
222 pub before_feature_tys: Ty<'tcx>,
223 /// Tuple containing the types of closure captures after the feature `capture_disjoint_fields`
224 pub after_feature_tys: Ty<'tcx>,
225}
226
32a655c1
SL
227pub trait DefIdTree: Copy {
228 fn parent(self, id: DefId) -> Option<DefId>;
a7813a04 229
32a655c1
SL
230 fn is_descendant_of(self, mut descendant: DefId, ancestor: DefId) -> bool {
231 if descendant.krate != ancestor.krate {
232 return false;
233 }
234
235 while descendant != ancestor {
236 match self.parent(descendant) {
237 Some(parent) => descendant = parent,
238 None => return false,
a7813a04 239 }
a7813a04
XL
240 }
241 true
242 }
243}
244
dc9dc135 245impl<'tcx> DefIdTree for TyCtxt<'tcx> {
32a655c1 246 fn parent(self, id: DefId) -> Option<DefId> {
74b04a01 247 self.def_key(id).parent.map(|index| DefId { index, ..id })
32a655c1
SL
248 }
249}
250
54a0048b 251impl Visibility {
dfeec247 252 pub fn from_hir(visibility: &hir::Visibility<'_>, id: hir::HirId, tcx: TyCtxt<'_>) -> Self {
8faf50e0
XL
253 match visibility.node {
254 hir::VisibilityKind::Public => Visibility::Public,
255 hir::VisibilityKind::Crate(_) => Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)),
48663c56 256 hir::VisibilityKind::Restricted { ref path, .. } => match path.res {
a7813a04
XL
257 // If there is no resolution, `resolve` will have already reported an error, so
258 // assume that the visibility is public to avoid reporting more privacy errors.
48663c56 259 Res::Err => Visibility::Public,
32a655c1 260 def => Visibility::Restricted(def.def_id()),
a7813a04 261 },
ba9703b0
XL
262 hir::VisibilityKind::Inherited => {
263 Visibility::Restricted(tcx.parent_module(id).to_def_id())
264 }
54a0048b
SL
265 }
266 }
267
a1dfa0c6 268 /// Returns `true` if an item with this visibility is accessible from the given block.
32a655c1 269 pub fn is_accessible_from<T: DefIdTree>(self, module: DefId, tree: T) -> bool {
54a0048b
SL
270 let restriction = match self {
271 // Public items are visible everywhere.
272 Visibility::Public => return true,
273 // Private items from other crates are visible nowhere.
32a655c1 274 Visibility::Invisible => return false,
54a0048b 275 // Restricted items are visible in an arbitrary local module.
32a655c1 276 Visibility::Restricted(other) if other.krate != module.krate => return false,
54a0048b
SL
277 Visibility::Restricted(module) => module,
278 };
279
32a655c1 280 tree.is_descendant_of(module, restriction)
54a0048b
SL
281 }
282
a1dfa0c6 283 /// Returns `true` if this visibility is at least as accessible as the given visibility
32a655c1 284 pub fn is_at_least<T: DefIdTree>(self, vis: Visibility, tree: T) -> bool {
54a0048b
SL
285 let vis_restriction = match vis {
286 Visibility::Public => return self == Visibility::Public,
32a655c1 287 Visibility::Invisible => return true,
54a0048b
SL
288 Visibility::Restricted(module) => module,
289 };
290
a7813a04 291 self.is_accessible_from(vis_restriction, tree)
54a0048b 292 }
ff7c6d11 293
a1dfa0c6 294 // Returns `true` if this item is visible anywhere in the local crate.
ff7c6d11
XL
295 pub fn is_visible_locally(self) -> bool {
296 match self {
297 Visibility::Public => true,
298 Visibility::Restricted(def_id) => def_id.is_local(),
299 Visibility::Invisible => false,
300 }
301 }
54a0048b
SL
302}
303
7cac9316
XL
304/// The crate variances map is computed during typeck and contains the
305/// variance of every item in the local crate. You should not use it
306/// directly, because to do so will make your pass dependent on the
307/// HIR of every item in the local crate. Instead, use
308/// `tcx.variances_of()` to get the variance for a *particular*
309/// item.
5869c6ff 310#[derive(HashStable, Debug)]
48663c56 311pub struct CrateVariancesMap<'tcx> {
7cac9316 312 /// For each item with generics, maps to a vector of the variance
9fa01778 313 /// of its generics. If an item has no generics, it will have no
7cac9316 314 /// entry.
48663c56 315 pub variances: FxHashMap<DefId, &'tcx [ty::Variance]>,
7cac9316
XL
316}
317
e9174d1e
SL
318// Contains information needed to resolve types and (in the future) look up
319// the types of AST nodes.
320#[derive(Copy, Clone, PartialEq, Eq, Hash)]
321pub struct CReaderCacheKey {
17df50a5 322 pub cnum: Option<CrateNum>,
e9174d1e 323 pub pos: usize,
e9174d1e
SL
324}
325
e1599b0c 326#[allow(rustc::usage_of_ty_tykind)]
e9174d1e 327pub struct TyS<'tcx> {
1b1a35ee
XL
328 /// This field shouldn't be used directly and may be removed in the future.
329 /// Use `TyS::kind()` instead.
330 kind: TyKind<'tcx>,
331 /// This field shouldn't be used directly and may be removed in the future.
332 /// Use `TyS::flags()` instead.
333 flags: TypeFlags,
e9174d1e 334
94b46f34
XL
335 /// This is a kind of confusing thing: it stores the smallest
336 /// binder such that
337 ///
338 /// (a) the binder itself captures nothing but
339 /// (b) all the late-bound things within the type are captured
340 /// by some sub-binder.
341 ///
342 /// So, for a type without any late-bound things, like `u32`, this
0731742a 343 /// will be *innermost*, because that is the innermost binder that
94b46f34 344 /// captures nothing. But for a type `&'D u32`, where `'D` is a
9fa01778 345 /// late-bound region with De Bruijn index `D`, this would be `D + 1`
0731742a
XL
346 /// -- the binder itself does not capture `D`, but `D` is captured
347 /// by an inner binder.
94b46f34 348 ///
0731742a 349 /// We call this concept an "exclusive" binder `D` because all
9fa01778 350 /// De Bruijn indices within the type are contained within `0..D`
0731742a 351 /// (exclusive).
94b46f34
XL
352 outer_exclusive_binder: ty::DebruijnIndex,
353}
354
fc512014
XL
355impl<'tcx> TyS<'tcx> {
356 /// A constructor used only for internal testing.
357 #[allow(rustc::usage_of_ty_tykind)]
358 pub fn make_for_test(
359 kind: TyKind<'tcx>,
360 flags: TypeFlags,
361 outer_exclusive_binder: ty::DebruijnIndex,
362 ) -> TyS<'tcx> {
363 TyS { kind, flags, outer_exclusive_binder }
364 }
365}
366
a1dfa0c6 367// `TyS` is used a lot. Make sure it doesn't unintentionally get bigger.
6a06907d 368#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
cdc7bbd5 369static_assert_size!(TyS<'_>, 40);
a1dfa0c6 370
94b46f34
XL
371impl<'tcx> Ord for TyS<'tcx> {
372 fn cmp(&self, other: &TyS<'tcx>) -> Ordering {
1b1a35ee 373 self.kind().cmp(other.kind())
94b46f34
XL
374 }
375}
376
377impl<'tcx> PartialOrd for TyS<'tcx> {
378 fn partial_cmp(&self, other: &TyS<'tcx>) -> Option<Ordering> {
1b1a35ee 379 Some(self.kind().cmp(other.kind()))
94b46f34 380 }
e9174d1e
SL
381}
382
383impl<'tcx> PartialEq for TyS<'tcx> {
384 #[inline]
385 fn eq(&self, other: &TyS<'tcx>) -> bool {
8faf50e0 386 ptr::eq(self, other)
e9174d1e
SL
387 }
388}
389impl<'tcx> Eq for TyS<'tcx> {}
390
391impl<'tcx> Hash for TyS<'tcx> {
392 fn hash<H: Hasher>(&self, s: &mut H) {
0bf4aa26 393 (self as *const TyS<'_>).hash(s)
e9174d1e
SL
394 }
395}
396
f035d41b 397impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for TyS<'tcx> {
e74abb32 398 fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
cc61c64b 399 let ty::TyS {
e74abb32 400 ref kind,
cc61c64b
XL
401
402 // The other fields just provide fast access to information that is
e74abb32 403 // also contained in `kind`, so no need to hash them.
cc61c64b 404 flags: _,
94b46f34
XL
405
406 outer_exclusive_binder: _,
cc61c64b
XL
407 } = *self;
408
e74abb32 409 kind.hash_stable(hcx, hasher);
cc61c64b
XL
410 }
411}
412
e74abb32 413#[rustc_diagnostic_item = "Ty"]
e9174d1e
SL
414pub type Ty<'tcx> = &'tcx TyS<'tcx>;
415
94b46f34 416impl ty::EarlyBoundRegion {
b7449926
XL
417 /// Does this early bound region have a name? Early bound regions normally
418 /// always have names except when using anonymous lifetimes (`'_`).
419 pub fn has_name(&self) -> bool {
e74abb32 420 self.name != kw::UnderscoreLifetime
b7449926 421 }
94b46f34 422}
ea8adc8c 423
f035d41b
XL
424#[derive(Debug)]
425crate struct PredicateInner<'tcx> {
cdc7bbd5 426 kind: Binder<'tcx, PredicateKind<'tcx>>,
f035d41b
XL
427 flags: TypeFlags,
428 /// See the comment for the corresponding field of [TyS].
429 outer_exclusive_binder: ty::DebruijnIndex,
430}
431
6a06907d 432#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
cdc7bbd5 433static_assert_size!(PredicateInner<'_>, 48);
f035d41b
XL
434
435#[derive(Clone, Copy, Lift)]
f9f354fc 436pub struct Predicate<'tcx> {
f035d41b 437 inner: &'tcx PredicateInner<'tcx>,
f9f354fc
XL
438}
439
440impl<'tcx> PartialEq for Predicate<'tcx> {
441 fn eq(&self, other: &Self) -> bool {
442 // `self.kind` is always interned.
f035d41b
XL
443 ptr::eq(self.inner, other.inner)
444 }
445}
446
447impl Hash for Predicate<'_> {
448 fn hash<H: Hasher>(&self, s: &mut H) {
449 (self.inner as *const PredicateInner<'_>).hash(s)
f9f354fc
XL
450 }
451}
452
453impl<'tcx> Eq for Predicate<'tcx> {}
454
455impl<'tcx> Predicate<'tcx> {
cdc7bbd5 456 /// Gets the inner `Binder<'tcx, PredicateKind<'tcx>>`.
6a06907d 457 #[inline]
cdc7bbd5 458 pub fn kind(self) -> Binder<'tcx, PredicateKind<'tcx>> {
5869c6ff 459 self.inner.kind
3dfed10e 460 }
f035d41b
XL
461}
462
463impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for Predicate<'tcx> {
464 fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
465 let PredicateInner {
466 ref kind,
467
468 // The other fields just provide fast access to information that is
469 // also contained in `kind`, so no need to hash them.
470 flags: _,
471 outer_exclusive_binder: _,
472 } = self.inner;
473
474 kind.hash_stable(hcx, hasher);
f9f354fc
XL
475 }
476}
477
3dfed10e 478#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
60c5eb7d 479#[derive(HashStable, TypeFoldable)]
f9f354fc 480pub enum PredicateKind<'tcx> {
dc9dc135 481 /// Corresponds to `where Foo: Bar<A, B, C>`. `Foo` here would be
e9174d1e 482 /// the `Self` type of the trait reference and `A`, `B`, and `C`
9e0c209e 483 /// would be the type parameters.
94222f64 484 Trait(TraitPredicate<'tcx>),
e9174d1e 485
dc9dc135 486 /// `where 'a: 'b`
3dfed10e 487 RegionOutlives(RegionOutlivesPredicate<'tcx>),
e9174d1e 488
dc9dc135 489 /// `where T: 'a`
3dfed10e 490 TypeOutlives(TypeOutlivesPredicate<'tcx>),
e9174d1e 491
dc9dc135 492 /// `where <T as TraitRef>::Name == X`, approximately.
a1dfa0c6 493 /// See the `ProjectionPredicate` struct for details.
3dfed10e 494 Projection(ProjectionPredicate<'tcx>),
e9174d1e 495
dc9dc135 496 /// No syntax: `T` well-formed.
f035d41b 497 WellFormed(GenericArg<'tcx>),
e9174d1e 498
dc9dc135 499 /// Trait must be object-safe.
e9174d1e 500 ObjectSafe(DefId),
a7813a04 501
a1dfa0c6
XL
502 /// No direct syntax. May be thought of as `where T: FnFoo<...>`
503 /// for some substitutions `...` and `T` being a closure type.
9e0c209e 504 /// Satisfied (or refuted) once we know the closure's kind.
e74abb32 505 ClosureKind(DefId, SubstsRef<'tcx>, ClosureKind),
cc61c64b
XL
506
507 /// `T1 <: T2`
94222f64
XL
508 ///
509 /// This obligation is created most often when we have two
510 /// unresolved type variables and hence don't have enough
511 /// information to process the subtyping obligation yet.
3dfed10e 512 Subtype(SubtypePredicate<'tcx>),
ea8adc8c 513
94222f64
XL
514 /// `T1` coerced to `T2`
515 ///
516 /// Like a subtyping obligation, this is created most often
517 /// when we have two unresolved type variables and hence
518 /// don't have enough information to process the coercion
519 /// obligation yet. At the moment, we actually process coercions
520 /// very much like subtyping and don't handle the full coercion
521 /// logic.
522 Coerce(CoercePredicate<'tcx>),
523
ea8adc8c 524 /// Constant initializer must evaluate successfully.
94222f64 525 ConstEvaluatable(ty::Unevaluated<'tcx, ()>),
f9f354fc
XL
526
527 /// Constants must be equal. The first component is the const that is expected.
528 ConstEquate(&'tcx Const<'tcx>, &'tcx Const<'tcx>),
1b1a35ee
XL
529
530 /// Represents a type found in the environment that we can use for implied bounds.
531 ///
532 /// Only used for Chalk.
533 TypeWellFormedFromEnv(Ty<'tcx>),
e9174d1e
SL
534}
535
83c7162d
XL
536/// The crate outlives map is computed during typeck and contains the
537/// outlives of every item in the local crate. You should not use it
538/// directly, because to do so will make your pass dependent on the
539/// HIR of every item in the local crate. Instead, use
540/// `tcx.inferred_outlives_of()` to get the outlives for a *particular*
541/// item.
5869c6ff 542#[derive(HashStable, Debug)]
83c7162d
XL
543pub struct CratePredicatesMap<'tcx> {
544 /// For each struct with outlive bounds, maps to a vector of the
545 /// predicate of its outlive bounds. If an item has no outlives
546 /// bounds, it will have no entry.
3dfed10e 547 pub predicates: FxHashMap<DefId, &'tcx [(Predicate<'tcx>, Span)]>,
83c7162d
XL
548}
549
dc9dc135 550impl<'tcx> Predicate<'tcx> {
e9174d1e
SL
551 /// Performs a substitution suitable for going from a
552 /// poly-trait-ref to supertraits that must hold if that
553 /// poly-trait-ref holds. This is slightly different from a normal
9fa01778 554 /// substitution in terms of what happens with bound regions. See
e9174d1e 555 /// lengthy comment below for details.
dc9dc135 556 pub fn subst_supertrait(
f9f354fc 557 self,
dc9dc135
XL
558 tcx: TyCtxt<'tcx>,
559 trait_ref: &ty::PolyTraitRef<'tcx>,
3dfed10e 560 ) -> Predicate<'tcx> {
e9174d1e
SL
561 // The interaction between HRTB and supertraits is not entirely
562 // obvious. Let me walk you (and myself) through an example.
563 //
564 // Let's start with an easy case. Consider two traits:
565 //
a1dfa0c6 566 // trait Foo<'a>: Bar<'a,'a> { }
e9174d1e
SL
567 // trait Bar<'b,'c> { }
568 //
a1dfa0c6
XL
569 // Now, if we have a trait reference `for<'x> T: Foo<'x>`, then
570 // we can deduce that `for<'x> T: Bar<'x,'x>`. Basically, if we
e9174d1e
SL
571 // knew that `Foo<'x>` (for any 'x) then we also know that
572 // `Bar<'x,'x>` (for any 'x). This more-or-less falls out from
573 // normal substitution.
574 //
575 // In terms of why this is sound, the idea is that whenever there
576 // is an impl of `T:Foo<'a>`, it must show that `T:Bar<'a,'a>`
577 // holds. So if there is an impl of `T:Foo<'a>` that applies to
578 // all `'a`, then we must know that `T:Bar<'a,'a>` holds for all
579 // `'a`.
580 //
581 // Another example to be careful of is this:
582 //
a1dfa0c6 583 // trait Foo1<'a>: for<'b> Bar1<'a,'b> { }
e9174d1e
SL
584 // trait Bar1<'b,'c> { }
585 //
a1dfa0c6
XL
586 // Here, if we have `for<'x> T: Foo1<'x>`, then what do we know?
587 // The answer is that we know `for<'x,'b> T: Bar1<'x,'b>`. The
e9174d1e 588 // reason is similar to the previous example: any impl of
a1dfa0c6 589 // `T:Foo1<'x>` must show that `for<'b> T: Bar1<'x, 'b>`. So
e9174d1e
SL
590 // basically we would want to collapse the bound lifetimes from
591 // the input (`trait_ref`) and the supertraits.
592 //
593 // To achieve this in practice is fairly straightforward. Let's
594 // consider the more complicated scenario:
595 //
a1dfa0c6
XL
596 // - We start out with `for<'x> T: Foo1<'x>`. In this case, `'x`
597 // has a De Bruijn index of 1. We want to produce `for<'x,'b> T: Bar1<'x,'b>`,
e9174d1e
SL
598 // where both `'x` and `'b` would have a DB index of 1.
599 // The substitution from the input trait-ref is therefore going to be
600 // `'a => 'x` (where `'x` has a DB index of 1).
601 // - The super-trait-ref is `for<'b> Bar1<'a,'b>`, where `'a` is an
602 // early-bound parameter and `'b' is a late-bound parameter with a
603 // DB index of 1.
604 // - If we replace `'a` with `'x` from the input, it too will have
605 // a DB index of 1, and thus we'll have `for<'x,'b> Bar1<'x,'b>`
606 // just as we wanted.
607 //
608 // There is only one catch. If we just apply the substitution `'a
609 // => 'x` to `for<'b> Bar1<'a,'b>`, the substitution code will
610 // adjust the DB index because we substituting into a binder (it
611 // tries to be so smart...) resulting in `for<'x> for<'b>
612 // Bar1<'x,'b>` (we have no syntax for this, so use your
613 // imagination). Basically the 'x will have DB index of 2 and 'b
614 // will have DB index of 1. Not quite what we want. So we apply
615 // the substitution to the *contents* of the trait reference,
616 // rather than the trait reference itself (put another way, the
617 // substitution code expects equal binding levels in the values
618 // from the substitution and the value being substituted into, and
619 // this trick achieves that).
cdc7bbd5
XL
620
621 // Working through the second example:
622 // trait_ref: for<'x> T: Foo1<'^0.0>; substs: [T, '^0.0]
623 // predicate: for<'b> Self: Bar1<'a, '^0.0>; substs: [Self, 'a, '^0.0]
624 // We want to end up with:
625 // for<'x, 'b> T: Bar1<'^0.0, '^0.1>
626 // To do this:
627 // 1) We must shift all bound vars in predicate by the length
628 // of trait ref's bound vars. So, we would end up with predicate like
629 // Self: Bar1<'a, '^0.1>
630 // 2) We can then apply the trait substs to this, ending up with
631 // T: Bar1<'^0.0, '^0.1>
632 // 3) Finally, to create the final bound vars, we concatenate the bound
633 // vars of the trait ref with those of the predicate:
634 // ['x, 'b]
635 let bound_pred = self.kind();
636 let pred_bound_vars = bound_pred.bound_vars();
637 let trait_bound_vars = trait_ref.bound_vars();
638 // 1) Self: Bar1<'a, '^0.0> -> Self: Bar1<'a, '^0.1>
639 let shifted_pred =
640 tcx.shift_bound_var_indices(trait_bound_vars.len(), bound_pred.skip_binder());
641 // 2) Self: Bar1<'a, '^0.1> -> T: Bar1<'^0.0, '^0.1>
642 let new = shifted_pred.subst(tcx, trait_ref.skip_binder().substs);
643 // 3) ['x] + ['b] -> ['x, 'b]
644 let bound_vars =
645 tcx.mk_bound_variable_kinds(trait_bound_vars.iter().chain(pred_bound_vars));
646 tcx.reuse_or_mk_predicate(self, ty::Binder::bind_with_vars(new, bound_vars))
e9174d1e
SL
647 }
648}
649
3dfed10e 650#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
60c5eb7d 651#[derive(HashStable, TypeFoldable)]
e9174d1e 652pub struct TraitPredicate<'tcx> {
dfeec247 653 pub trait_ref: TraitRef<'tcx>,
94222f64
XL
654
655 pub constness: BoundConstness,
e9174d1e 656}
a1dfa0c6 657
cdc7bbd5 658pub type PolyTraitPredicate<'tcx> = ty::Binder<'tcx, TraitPredicate<'tcx>>;
e9174d1e
SL
659
660impl<'tcx> TraitPredicate<'tcx> {
f9f354fc 661 pub fn def_id(self) -> DefId {
e9174d1e
SL
662 self.trait_ref.def_id
663 }
664
f9f354fc 665 pub fn self_ty(self) -> Ty<'tcx> {
e9174d1e
SL
666 self.trait_ref.self_ty()
667 }
668}
669
670impl<'tcx> PolyTraitPredicate<'tcx> {
f9f354fc 671 pub fn def_id(self) -> DefId {
416331ca 672 // Ok to skip binder since trait `DefId` does not care about regions.
83c7162d 673 self.skip_binder().def_id()
e9174d1e 674 }
fc512014 675
cdc7bbd5 676 pub fn self_ty(self) -> ty::Binder<'tcx, Ty<'tcx>> {
fc512014
XL
677 self.map_bound(|trait_ref| trait_ref.self_ty())
678 }
e9174d1e
SL
679}
680
3dfed10e 681#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TyEncodable, TyDecodable)]
60c5eb7d 682#[derive(HashStable, TypeFoldable)]
dc9dc135 683pub struct OutlivesPredicate<A, B>(pub A, pub B); // `A: B`
dc9dc135
XL
684pub type RegionOutlivesPredicate<'tcx> = OutlivesPredicate<ty::Region<'tcx>, ty::Region<'tcx>>;
685pub type TypeOutlivesPredicate<'tcx> = OutlivesPredicate<Ty<'tcx>, ty::Region<'tcx>>;
cdc7bbd5
XL
686pub type PolyRegionOutlivesPredicate<'tcx> = ty::Binder<'tcx, RegionOutlivesPredicate<'tcx>>;
687pub type PolyTypeOutlivesPredicate<'tcx> = ty::Binder<'tcx, TypeOutlivesPredicate<'tcx>>;
e9174d1e 688
94222f64
XL
689/// Encodes that `a` must be a subtype of `b`. The `a_is_expected` flag indicates
690/// whether the `a` type is the type that we should label as "expected" when
691/// presenting user diagnostics.
3dfed10e 692#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, TyEncodable, TyDecodable)]
60c5eb7d 693#[derive(HashStable, TypeFoldable)]
cc61c64b
XL
694pub struct SubtypePredicate<'tcx> {
695 pub a_is_expected: bool,
696 pub a: Ty<'tcx>,
dfeec247 697 pub b: Ty<'tcx>,
cc61c64b 698}
cdc7bbd5 699pub type PolySubtypePredicate<'tcx> = ty::Binder<'tcx, SubtypePredicate<'tcx>>;
cc61c64b 700
94222f64
XL
701/// Encodes that we have to coerce *from* the `a` type to the `b` type.
702#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, TyEncodable, TyDecodable)]
703#[derive(HashStable, TypeFoldable)]
704pub struct CoercePredicate<'tcx> {
705 pub a: Ty<'tcx>,
706 pub b: Ty<'tcx>,
707}
708pub type PolyCoercePredicate<'tcx> = ty::Binder<'tcx, CoercePredicate<'tcx>>;
709
e9174d1e
SL
710/// This kind of predicate has no *direct* correspondent in the
711/// syntax, but it roughly corresponds to the syntactic forms:
712///
9fa01778 713/// 1. `T: TraitRef<..., Item = Type>`
e9174d1e
SL
714/// 2. `<T as TraitRef<...>>::Item == Type` (NYI)
715///
716/// In particular, form #1 is "desugared" to the combination of a
a1dfa0c6 717/// normal trait predicate (`T: TraitRef<...>`) and one of these
e9174d1e 718/// predicates. Form #2 is a broader form in that it also permits
ff7c6d11
XL
719/// equality between arbitrary types. Processing an instance of
720/// Form #2 eventually yields one of these `ProjectionPredicate`
e9174d1e 721/// instances to normalize the LHS.
3dfed10e 722#[derive(Copy, Clone, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
60c5eb7d 723#[derive(HashStable, TypeFoldable)]
e9174d1e
SL
724pub struct ProjectionPredicate<'tcx> {
725 pub projection_ty: ProjectionTy<'tcx>,
726 pub ty: Ty<'tcx>,
727}
728
cdc7bbd5 729pub type PolyProjectionPredicate<'tcx> = Binder<'tcx, ProjectionPredicate<'tcx>>;
e9174d1e
SL
730
731impl<'tcx> PolyProjectionPredicate<'tcx> {
6a06907d
XL
732 /// Returns the `DefId` of the trait of the associated item being projected.
733 #[inline]
734 pub fn trait_def_id(&self, tcx: TyCtxt<'tcx>) -> DefId {
735 self.skip_binder().projection_ty.trait_def_id(tcx)
736 }
737
6a06907d
XL
738 /// Get the [PolyTraitRef] required for this projection to be well formed.
739 /// Note that for generic associated types the predicates of the associated
740 /// type also need to be checked.
a1dfa0c6 741 #[inline]
6a06907d 742 pub fn required_poly_trait_ref(&self, tcx: TyCtxt<'tcx>) -> PolyTraitRef<'tcx> {
a1dfa0c6
XL
743 // Note: unlike with `TraitRef::to_poly_trait_ref()`,
744 // `self.0.trait_ref` is permitted to have escaping regions.
041b39d2
XL
745 // This is because here `self` has a `Binder` and so does our
746 // return value, so we are preserving the number of binding
747 // levels.
83c7162d 748 self.map_bound(|predicate| predicate.projection_ty.trait_ref(tcx))
e9174d1e 749 }
3b2f2976 750
cdc7bbd5 751 pub fn ty(&self) -> Binder<'tcx, Ty<'tcx>> {
83c7162d
XL
752 self.map_bound(|predicate| predicate.ty)
753 }
754
a1dfa0c6 755 /// The `DefId` of the `TraitItem` for the associated type.
83c7162d 756 ///
a1dfa0c6
XL
757 /// Note that this is not the `DefId` of the `TraitRef` containing this
758 /// associated type, which is in `tcx.associated_item(projection_def_id()).container`.
83c7162d 759 pub fn projection_def_id(&self) -> DefId {
416331ca 760 // Ok to skip binder since trait `DefId` does not care about regions.
83c7162d 761 self.skip_binder().projection_ty.item_def_id
3b2f2976 762 }
e9174d1e
SL
763}
764
765pub trait ToPolyTraitRef<'tcx> {
766 fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx>;
767}
768
769impl<'tcx> ToPolyTraitRef<'tcx> for TraitRef<'tcx> {
770 fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx> {
dfeec247 771 ty::Binder::dummy(*self)
e9174d1e
SL
772 }
773}
774
775impl<'tcx> ToPolyTraitRef<'tcx> for PolyTraitPredicate<'tcx> {
776 fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx> {
7453a54e 777 self.map_bound_ref(|trait_pred| trait_pred.trait_ref)
e9174d1e
SL
778 }
779}
780
e9174d1e 781pub trait ToPredicate<'tcx> {
f035d41b 782 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx>;
f9f354fc
XL
783}
784
cdc7bbd5 785impl ToPredicate<'tcx> for Binder<'tcx, PredicateKind<'tcx>> {
f9f354fc 786 #[inline(always)]
f035d41b
XL
787 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
788 tcx.mk_predicate(self)
f9f354fc 789 }
e9174d1e
SL
790}
791
5869c6ff 792impl ToPredicate<'tcx> for PredicateKind<'tcx> {
3dfed10e 793 #[inline(always)]
f035d41b 794 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
5869c6ff 795 tcx.mk_predicate(Binder::dummy(self))
dfeec247
XL
796 }
797}
798
3dfed10e 799impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<TraitRef<'tcx>> {
f035d41b 800 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
94222f64
XL
801 PredicateKind::Trait(ty::TraitPredicate {
802 trait_ref: self.value,
803 constness: self.constness,
804 })
805 .to_predicate(tcx)
e9174d1e
SL
806 }
807}
808
dfeec247 809impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<PolyTraitRef<'tcx>> {
f035d41b 810 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
cdc7bbd5
XL
811 self.value
812 .map_bound(|trait_ref| {
94222f64 813 PredicateKind::Trait(ty::TraitPredicate { trait_ref, constness: self.constness })
cdc7bbd5
XL
814 })
815 .to_predicate(tcx)
dfeec247
XL
816 }
817}
818
94222f64 819impl<'tcx> ToPredicate<'tcx> for PolyTraitPredicate<'tcx> {
f035d41b 820 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
94222f64 821 self.map_bound(PredicateKind::Trait).to_predicate(tcx)
e9174d1e
SL
822 }
823}
824
9e0c209e 825impl<'tcx> ToPredicate<'tcx> for PolyRegionOutlivesPredicate<'tcx> {
f035d41b 826 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
5869c6ff 827 self.map_bound(PredicateKind::RegionOutlives).to_predicate(tcx)
e9174d1e
SL
828 }
829}
830
831impl<'tcx> ToPredicate<'tcx> for PolyTypeOutlivesPredicate<'tcx> {
f035d41b 832 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
5869c6ff 833 self.map_bound(PredicateKind::TypeOutlives).to_predicate(tcx)
e9174d1e
SL
834 }
835}
836
837impl<'tcx> ToPredicate<'tcx> for PolyProjectionPredicate<'tcx> {
f035d41b 838 fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
5869c6ff 839 self.map_bound(PredicateKind::Projection).to_predicate(tcx)
e9174d1e
SL
840 }
841}
842
843impl<'tcx> Predicate<'tcx> {
fc512014 844 pub fn to_opt_poly_trait_ref(self) -> Option<ConstnessAnd<PolyTraitRef<'tcx>>> {
5869c6ff 845 let predicate = self.kind();
fc512014 846 match predicate.skip_binder() {
94222f64
XL
847 PredicateKind::Trait(t) => {
848 Some(ConstnessAnd { constness: t.constness, value: predicate.rebind(t.trait_ref) })
fc512014 849 }
5869c6ff
XL
850 PredicateKind::Projection(..)
851 | PredicateKind::Subtype(..)
94222f64 852 | PredicateKind::Coerce(..)
5869c6ff
XL
853 | PredicateKind::RegionOutlives(..)
854 | PredicateKind::WellFormed(..)
855 | PredicateKind::ObjectSafe(..)
856 | PredicateKind::ClosureKind(..)
857 | PredicateKind::TypeOutlives(..)
858 | PredicateKind::ConstEvaluatable(..)
859 | PredicateKind::ConstEquate(..)
860 | PredicateKind::TypeWellFormedFromEnv(..) => None,
e9174d1e
SL
861 }
862 }
abe05a73 863
f9f354fc 864 pub fn to_opt_type_outlives(self) -> Option<PolyTypeOutlivesPredicate<'tcx>> {
5869c6ff 865 let predicate = self.kind();
fc512014 866 match predicate.skip_binder() {
5869c6ff
XL
867 PredicateKind::TypeOutlives(data) => Some(predicate.rebind(data)),
868 PredicateKind::Trait(..)
869 | PredicateKind::Projection(..)
870 | PredicateKind::Subtype(..)
94222f64 871 | PredicateKind::Coerce(..)
5869c6ff
XL
872 | PredicateKind::RegionOutlives(..)
873 | PredicateKind::WellFormed(..)
874 | PredicateKind::ObjectSafe(..)
875 | PredicateKind::ClosureKind(..)
876 | PredicateKind::ConstEvaluatable(..)
877 | PredicateKind::ConstEquate(..)
878 | PredicateKind::TypeWellFormedFromEnv(..) => None,
abe05a73
XL
879 }
880 }
e9174d1e
SL
881}
882
883/// Represents the bounds declared on a particular set of type
9fa01778 884/// parameters. Should eventually be generalized into a flag list of
94222f64 885/// where-clauses. You can obtain an `InstantiatedPredicates` list from a
e9174d1e
SL
886/// `GenericPredicates` by using the `instantiate` method. Note that this method
887/// reflects an important semantic invariant of `InstantiatedPredicates`: while
888/// the `GenericPredicates` are expressed in terms of the bound type
889/// parameters of the impl/trait/whatever, an `InstantiatedPredicates` instance
890/// represented a set of bounds for some particular instantiation,
891/// meaning that the generic parameters have been substituted with
892/// their values.
893///
894/// Example:
895///
dc9dc135 896/// struct Foo<T, U: Bar<T>> { ... }
e9174d1e
SL
897///
898/// Here, the `GenericPredicates` for `Foo` would contain a list of bounds like
9fa01778 899/// `[[], [U:Bar<T>]]`. Now if there were some particular reference
e9174d1e
SL
900/// like `Foo<isize,usize>`, then the `InstantiatedPredicates` would be `[[],
901/// [usize:Bar<isize>]]`.
60c5eb7d 902#[derive(Clone, Debug, TypeFoldable)]
e9174d1e 903pub struct InstantiatedPredicates<'tcx> {
9e0c209e 904 pub predicates: Vec<Predicate<'tcx>>,
74b04a01 905 pub spans: Vec<Span>,
e9174d1e
SL
906}
907
908impl<'tcx> InstantiatedPredicates<'tcx> {
909 pub fn empty() -> InstantiatedPredicates<'tcx> {
74b04a01 910 InstantiatedPredicates { predicates: vec![], spans: vec![] }
e9174d1e
SL
911 }
912
913 pub fn is_empty(&self) -> bool {
914 self.predicates.is_empty()
915 }
916}
917
136023e0 918#[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable, TyEncodable, TyDecodable, TypeFoldable)]
17df50a5
XL
919pub struct OpaqueTypeKey<'tcx> {
920 pub def_id: DefId,
921 pub substs: SubstsRef<'tcx>,
922}
923
e74abb32 924rustc_index::newtype_index! {
532ac7d7
XL
925 /// "Universes" are used during type- and trait-checking in the
926 /// presence of `for<..>` binders to control what sets of names are
927 /// visible. Universes are arranged into a tree: the root universe
928 /// contains names that are always visible. Each child then adds a new
929 /// set of names that are visible, in addition to those of its parent.
930 /// We say that the child universe "extends" the parent universe with
931 /// new names.
932 ///
933 /// To make this more concrete, consider this program:
934 ///
935 /// ```
936 /// struct Foo { }
937 /// fn bar<T>(x: T) {
938 /// let y: for<'a> fn(&'a u8, Foo) = ...;
939 /// }
940 /// ```
941 ///
942 /// The struct name `Foo` is in the root universe U0. But the type
943 /// parameter `T`, introduced on `bar`, is in an extended universe U1
944 /// -- i.e., within `bar`, we can name both `T` and `Foo`, but outside
945 /// of `bar`, we cannot name `T`. Then, within the type of `y`, the
946 /// region `'a` is in a universe U2 that extends U1, because we can
947 /// name it inside the fn type but not outside.
948 ///
949 /// Universes are used to do type- and trait-checking around these
950 /// "forall" binders (also called **universal quantification**). The
951 /// idea is that when, in the body of `bar`, we refer to `T` as a
952 /// type, we aren't referring to any type in particular, but rather a
953 /// kind of "fresh" type that is distinct from all other types we have
954 /// actually declared. This is called a **placeholder** type, and we
955 /// use universes to talk about this. In other words, a type name in
956 /// universe 0 always corresponds to some "ground" type that the user
957 /// declared, but a type name in a non-zero universe is a placeholder
958 /// type -- an idealized representative of "types in general" that we
959 /// use for checking generic functions.
0bf4aa26 960 pub struct UniverseIndex {
60c5eb7d 961 derive [HashStable]
0bf4aa26
XL
962 DEBUG_FORMAT = "U{}",
963 }
964}
0531ce1d 965
0bf4aa26 966impl UniverseIndex {
ba9703b0 967 pub const ROOT: UniverseIndex = UniverseIndex::from_u32(0);
8faf50e0 968
0bf4aa26
XL
969 /// Returns the "next" universe index in order -- this new index
970 /// is considered to extend all previous universes. This
9fa01778 971 /// corresponds to entering a `forall` quantifier. So, for
0bf4aa26 972 /// example, suppose we have this type in universe `U`:
0531ce1d
XL
973 ///
974 /// ```
975 /// for<'a> fn(&'a u32)
976 /// ```
977 ///
978 /// Once we "enter" into this `for<'a>` quantifier, we are in a
0bf4aa26
XL
979 /// new universe that extends `U` -- in this new universe, we can
980 /// name the region `'a`, but that region was not nameable from
981 /// `U` because it was not in scope there.
982 pub fn next_universe(self) -> UniverseIndex {
983 UniverseIndex::from_u32(self.private.checked_add(1).unwrap())
8faf50e0
XL
984 }
985
a1dfa0c6 986 /// Returns `true` if `self` can name a name from `other` -- in other words,
0bf4aa26 987 /// if the set of names in `self` is a superset of those in
a1dfa0c6 988 /// `other` (`self >= other`).
0bf4aa26
XL
989 pub fn can_name(self, other: UniverseIndex) -> bool {
990 self.private >= other.private
83c7162d 991 }
a1dfa0c6
XL
992
993 /// Returns `true` if `self` cannot name some names from `other` -- in other
994 /// words, if the set of names in `self` is a strict subset of
995 /// those in `other` (`self < other`).
996 pub fn cannot_name(self, other: UniverseIndex) -> bool {
997 self.private < other.private
998 }
83c7162d
XL
999}
1000
fc512014
XL
1001/// The "placeholder index" fully defines a placeholder region, type, or const. Placeholders are
1002/// identified by both a universe, as well as a name residing within that universe. Distinct bound
1003/// regions/types/consts within the same universe simply have an unknown relationship to one
0bf4aa26 1004/// another.
3dfed10e 1005#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TyEncodable, TyDecodable, PartialOrd, Ord)]
a1dfa0c6 1006pub struct Placeholder<T> {
0bf4aa26 1007 pub universe: UniverseIndex,
a1dfa0c6 1008 pub name: T,
0531ce1d
XL
1009}
1010
dc9dc135
XL
1011impl<'a, T> HashStable<StableHashingContext<'a>> for Placeholder<T>
1012where
1013 T: HashStable<StableHashingContext<'a>>,
a1dfa0c6 1014{
e74abb32 1015 fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
a1dfa0c6
XL
1016 self.universe.hash_stable(hcx, hasher);
1017 self.name.hash_stable(hcx, hasher);
1018 }
1019}
1020
fc512014 1021pub type PlaceholderRegion = Placeholder<BoundRegionKind>;
a1dfa0c6
XL
1022
1023pub type PlaceholderType = Placeholder<BoundVar>;
1024
fc512014
XL
1025#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, HashStable)]
1026#[derive(TyEncodable, TyDecodable, PartialOrd, Ord)]
1027pub struct BoundConst<'tcx> {
1028 pub var: BoundVar,
1029 pub ty: Ty<'tcx>,
1030}
1031
1032pub type PlaceholderConst<'tcx> = Placeholder<BoundConst<'tcx>>;
48663c56 1033
fc512014
XL
1034/// A `DefId` which, in case it is a const argument, is potentially bundled with
1035/// the `DefId` of the generic parameter it instantiates.
3dfed10e 1036///
fc512014
XL
1037/// This is used to avoid calls to `type_of` for const arguments during typeck
1038/// which cause cycle errors.
3dfed10e
XL
1039///
1040/// ```rust
3dfed10e
XL
1041/// struct A;
1042/// impl A {
fc512014
XL
1043/// fn foo<const N: usize>(&self) -> [u8; N] { [0; N] }
1044/// // ^ const parameter
3dfed10e
XL
1045/// }
1046/// struct B;
1047/// impl B {
fc512014
XL
1048/// fn foo<const M: u8>(&self) -> usize { 42 }
1049/// // ^ const parameter
3dfed10e
XL
1050/// }
1051///
1052/// fn main() {
1053/// let a = A;
fc512014
XL
1054/// let _b = a.foo::<{ 3 + 7 }>();
1055/// // ^^^^^^^^^ const argument
3dfed10e
XL
1056/// }
1057/// ```
fc512014
XL
1058///
1059/// Let's look at the call `a.foo::<{ 3 + 7 }>()` here. We do not know
1060/// which `foo` is used until we know the type of `a`.
1061///
1062/// We only know the type of `a` once we are inside of `typeck(main)`.
1063/// We also end up normalizing the type of `_b` during `typeck(main)` which
1064/// requires us to evaluate the const argument.
1065///
1066/// To evaluate that const argument we need to know its type,
1067/// which we would get using `type_of(const_arg)`. This requires us to
1068/// resolve `foo` as it can be either `usize` or `u8` in this example.
1069/// However, resolving `foo` once again requires `typeck(main)` to get the type of `a`,
1070/// which results in a cycle.
1071///
1072/// In short we must not call `type_of(const_arg)` during `typeck(main)`.
1073///
1074/// When first creating the `ty::Const` of the const argument inside of `typeck` we have
1075/// already resolved `foo` so we know which const parameter this argument instantiates.
1076/// This means that we also know the expected result of `type_of(const_arg)` even if we
1077/// aren't allowed to call that query: it is equal to `type_of(const_param)` which is
1078/// trivial to compute.
1079///
1080/// If we now want to use that constant in a place which potentionally needs its type
1081/// we also pass the type of its `const_param`. This is the point of `WithOptConstParam`,
1082/// except that instead of a `Ty` we bundle the `DefId` of the const parameter.
1083/// Meaning that we need to use `type_of(const_param_did)` if `const_param_did` is `Some`
1084/// to get the type of `did`.
3dfed10e
XL
1085#[derive(Copy, Clone, Debug, TypeFoldable, Lift, TyEncodable, TyDecodable)]
1086#[derive(PartialEq, Eq, PartialOrd, Ord)]
1087#[derive(Hash, HashStable)]
1088pub struct WithOptConstParam<T> {
1089 pub did: T,
29967ef6 1090 /// The `DefId` of the corresponding generic parameter in case `did` is
3dfed10e
XL
1091 /// a const argument.
1092 ///
1093 /// Note that even if `did` is a const argument, this may still be `None`.
1094 /// All queries taking `WithOptConstParam` start by calling `tcx.opt_const_param_of(def.did)`
fc512014 1095 /// to potentially update `param_did` in the case it is `None`.
3dfed10e
XL
1096 pub const_param_did: Option<DefId>,
1097}
1098
1099impl<T> WithOptConstParam<T> {
1100 /// Creates a new `WithOptConstParam` setting `const_param_did` to `None`.
1101 #[inline(always)]
1102 pub fn unknown(did: T) -> WithOptConstParam<T> {
1103 WithOptConstParam { did, const_param_did: None }
1104 }
1105}
1106
1107impl WithOptConstParam<LocalDefId> {
1108 /// Returns `Some((did, param_did))` if `def_id` is a const argument,
1109 /// `None` otherwise.
1110 #[inline(always)]
1111 pub fn try_lookup(did: LocalDefId, tcx: TyCtxt<'_>) -> Option<(LocalDefId, DefId)> {
1112 tcx.opt_const_param_of(did).map(|param_did| (did, param_did))
1113 }
1114
1115 /// In case `self` is unknown but `self.did` is a const argument, this returns
1116 /// a `WithOptConstParam` with the correct `const_param_did`.
1117 #[inline(always)]
1118 pub fn try_upgrade(self, tcx: TyCtxt<'_>) -> Option<WithOptConstParam<LocalDefId>> {
1119 if self.const_param_did.is_none() {
1120 if let const_param_did @ Some(_) = tcx.opt_const_param_of(self.did) {
1121 return Some(WithOptConstParam { did: self.did, const_param_did });
1122 }
1123 }
1124
1125 None
1126 }
1127
1128 pub fn to_global(self) -> WithOptConstParam<DefId> {
1129 WithOptConstParam { did: self.did.to_def_id(), const_param_did: self.const_param_did }
1130 }
1131
1132 pub fn def_id_for_type_of(self) -> DefId {
1133 if let Some(did) = self.const_param_did { did } else { self.did.to_def_id() }
1134 }
1135}
1136
1137impl WithOptConstParam<DefId> {
1138 pub fn as_local(self) -> Option<WithOptConstParam<LocalDefId>> {
1139 self.did
1140 .as_local()
1141 .map(|did| WithOptConstParam { did, const_param_did: self.const_param_did })
1142 }
1143
1144 pub fn as_const_arg(self) -> Option<(LocalDefId, DefId)> {
1145 if let Some(param_did) = self.const_param_did {
1146 if let Some(did) = self.did.as_local() {
1147 return Some((did, param_did));
1148 }
1149 }
1150
1151 None
1152 }
1153
3dfed10e
XL
1154 pub fn is_local(self) -> bool {
1155 self.did.is_local()
1156 }
1157
1158 pub fn def_id_for_type_of(self) -> DefId {
1159 self.const_param_did.unwrap_or(self.did)
1160 }
1161}
1162
7cac9316
XL
1163/// When type checking, we use the `ParamEnv` to track
1164/// details about the set of where-clauses that are in scope at this
1165/// particular point.
3dfed10e 1166#[derive(Copy, Clone, Hash, PartialEq, Eq)]
7cac9316 1167pub struct ParamEnv<'tcx> {
3dfed10e
XL
1168 /// This packs both caller bounds and the reveal enum into one pointer.
1169 ///
1170 /// Caller bounds are `Obligation`s that the caller must satisfy. This is
1171 /// basically the set of bounds on the in-scope type parameters, translated
416331ca 1172 /// into `Obligation`s, and elaborated and normalized.
f035d41b 1173 ///
3dfed10e
XL
1174 /// Use the `caller_bounds()` method to access.
1175 ///
94b46f34 1176 /// Typically, this is `Reveal::UserFacing`, but during codegen we
f035d41b
XL
1177 /// want `Reveal::All`.
1178 ///
3dfed10e
XL
1179 /// Note: This is packed, use the reveal() method to access it.
1180 packed: CopyTaggedPtr<&'tcx List<Predicate<'tcx>>, traits::Reveal, true>,
7cac9316
XL
1181}
1182
3dfed10e
XL
1183unsafe impl rustc_data_structures::tagged_ptr::Tag for traits::Reveal {
1184 const BITS: usize = 1;
17df50a5 1185 #[inline]
3dfed10e
XL
1186 fn into_usize(self) -> usize {
1187 match self {
1188 traits::Reveal::UserFacing => 0,
1189 traits::Reveal::All => 1,
1190 }
1191 }
17df50a5 1192 #[inline]
3dfed10e
XL
1193 unsafe fn from_usize(ptr: usize) -> Self {
1194 match ptr {
1195 0 => traits::Reveal::UserFacing,
1196 1 => traits::Reveal::All,
1197 _ => std::hint::unreachable_unchecked(),
1198 }
1199 }
1200}
1201
f035d41b
XL
1202impl<'tcx> fmt::Debug for ParamEnv<'tcx> {
1203 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1204 f.debug_struct("ParamEnv")
1205 .field("caller_bounds", &self.caller_bounds())
1206 .field("reveal", &self.reveal())
f035d41b
XL
1207 .finish()
1208 }
1209}
1210
f035d41b
XL
1211impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for ParamEnv<'tcx> {
1212 fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
1213 self.caller_bounds().hash_stable(hcx, hasher);
1214 self.reveal().hash_stable(hcx, hasher);
f035d41b
XL
1215 }
1216}
1217
1218impl<'tcx> TypeFoldable<'tcx> for ParamEnv<'tcx> {
fc512014 1219 fn super_fold_with<F: ty::fold::TypeFolder<'tcx>>(self, folder: &mut F) -> Self {
1b1a35ee 1220 ParamEnv::new(self.caller_bounds().fold_with(folder), self.reveal().fold_with(folder))
f035d41b
XL
1221 }
1222
fc512014 1223 fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
29967ef6
XL
1224 self.caller_bounds().visit_with(visitor)?;
1225 self.reveal().visit_with(visitor)
f035d41b
XL
1226 }
1227}
1228
7cac9316 1229impl<'tcx> ParamEnv<'tcx> {
0531ce1d 1230 /// Construct a trait environment suitable for contexts where
9fa01778 1231 /// there are no where-clauses in scope. Hidden types (like `impl
0531ce1d
XL
1232 /// Trait`) are left hidden, so this is suitable for ordinary
1233 /// type-checking.
a1dfa0c6 1234 #[inline]
0531ce1d 1235 pub fn empty() -> Self {
1b1a35ee 1236 Self::new(List::empty(), Reveal::UserFacing)
0531ce1d
XL
1237 }
1238
f035d41b 1239 #[inline]
3dfed10e
XL
1240 pub fn caller_bounds(self) -> &'tcx List<Predicate<'tcx>> {
1241 self.packed.pointer()
f035d41b
XL
1242 }
1243
1244 #[inline]
1245 pub fn reveal(self) -> traits::Reveal {
3dfed10e 1246 self.packed.tag()
f035d41b
XL
1247 }
1248
9fa01778 1249 /// Construct a trait environment with no where-clauses in scope
0531ce1d
XL
1250 /// where the values of all `impl Trait` and other hidden types
1251 /// are revealed. This is suitable for monomorphized, post-typeck
94b46f34 1252 /// environments like codegen or doing optimizations.
0531ce1d 1253 ///
9fa01778 1254 /// N.B., if you want to have predicates in scope, use `ParamEnv::new`,
0531ce1d 1255 /// or invoke `param_env.with_reveal_all()`.
a1dfa0c6 1256 #[inline]
0531ce1d 1257 pub fn reveal_all() -> Self {
1b1a35ee 1258 Self::new(List::empty(), Reveal::All)
0531ce1d
XL
1259 }
1260
1261 /// Construct a trait environment with the given set of predicates.
a1dfa0c6 1262 #[inline]
1b1a35ee
XL
1263 pub fn new(caller_bounds: &'tcx List<Predicate<'tcx>>, reveal: Reveal) -> Self {
1264 ty::ParamEnv { packed: CopyTaggedPtr::new(caller_bounds, reveal) }
f035d41b
XL
1265 }
1266
1267 pub fn with_user_facing(mut self) -> Self {
3dfed10e 1268 self.packed.set_tag(Reveal::UserFacing);
f035d41b 1269 self
0531ce1d
XL
1270 }
1271
1272 /// Returns a new parameter environment with the same clauses, but
1273 /// which "reveals" the true results of projections in all cases
9fa01778 1274 /// (even for associated types that are specializable). This is
94b46f34 1275 /// the desired behavior during codegen and certain other special
0531ce1d
XL
1276 /// contexts; normally though we want to use `Reveal::UserFacing`,
1277 /// which is the default.
3dfed10e
XL
1278 /// All opaque types in the caller_bounds of the `ParamEnv`
1279 /// will be normalized to their underlying types.
1280 /// See PR #65989 and issue #65918 for more details
1281 pub fn with_reveal_all_normalized(self, tcx: TyCtxt<'tcx>) -> Self {
1282 if self.packed.tag() == traits::Reveal::All {
1283 return self;
1284 }
1285
1b1a35ee 1286 ParamEnv::new(tcx.normalize_opaque_types(self.caller_bounds()), Reveal::All)
0531ce1d
XL
1287 }
1288
1289 /// Returns this same environment but with no caller bounds.
17df50a5 1290 #[inline]
0531ce1d 1291 pub fn without_caller_bounds(self) -> Self {
1b1a35ee 1292 Self::new(List::empty(), self.reveal())
0531ce1d
XL
1293 }
1294
7cac9316 1295 /// Creates a suitable environment in which to perform trait
0531ce1d
XL
1296 /// queries on the given value. When type-checking, this is simply
1297 /// the pair of the environment plus value. But when reveal is set to
1298 /// All, then if `value` does not reference any type parameters, we will
1299 /// pair it with the empty environment. This improves caching and is generally
1300 /// invisible.
e9174d1e 1301 ///
0731742a 1302 /// N.B., we preserve the environment when type-checking because it
0531ce1d 1303 /// is possible for the user to have wacky where-clauses like
7cac9316 1304 /// `where Box<u32>: Copy`, which are clearly never
0531ce1d
XL
1305 /// satisfiable. We generally want to behave as if they were true,
1306 /// although the surrounding function is never reachable.
7cac9316 1307 pub fn and<T: TypeFoldable<'tcx>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
f035d41b 1308 match self.reveal() {
dfeec247 1309 Reveal::UserFacing => ParamEnvAnd { param_env: self, value },
0531ce1d
XL
1310
1311 Reveal::All => {
94222f64 1312 if value.is_known_global() {
dfeec247 1313 ParamEnvAnd { param_env: self.without_caller_bounds(), value }
74b04a01
XL
1314 } else {
1315 ParamEnvAnd { param_env: self, value }
0531ce1d 1316 }
e9174d1e
SL
1317 }
1318 }
1319 }
1320}
1321
fc512014 1322#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TypeFoldable)]
dfeec247 1323pub struct ConstnessAnd<T> {
94222f64 1324 pub constness: BoundConstness,
dfeec247
XL
1325 pub value: T,
1326}
1327
f9f354fc 1328// FIXME(ecstaticmorse): Audit all occurrences of `without_const().to_predicate(tcx)` to ensure that
dfeec247
XL
1329// the constness of trait bounds is being propagated correctly.
1330pub trait WithConstness: Sized {
1331 #[inline]
94222f64 1332 fn with_constness(self, constness: BoundConstness) -> ConstnessAnd<Self> {
dfeec247
XL
1333 ConstnessAnd { constness, value: self }
1334 }
1335
1336 #[inline]
94222f64
XL
1337 fn with_const_if_const(self) -> ConstnessAnd<Self> {
1338 self.with_constness(BoundConstness::ConstIfConst)
dfeec247
XL
1339 }
1340
1341 #[inline]
1342 fn without_const(self) -> ConstnessAnd<Self> {
94222f64 1343 self.with_constness(BoundConstness::NotConst)
dfeec247
XL
1344 }
1345}
1346
1347impl<T> WithConstness for T {}
1348
60c5eb7d 1349#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TypeFoldable)]
7cac9316
XL
1350pub struct ParamEnvAnd<'tcx, T> {
1351 pub param_env: ParamEnv<'tcx>,
1352 pub value: T,
1353}
1354
1355impl<'tcx, T> ParamEnvAnd<'tcx, T> {
1356 pub fn into_parts(self) -> (ParamEnv<'tcx>, T) {
1357 (self.param_env, self.value)
1358 }
1359}
1360
dc9dc135
XL
1361impl<'a, 'tcx, T> HashStable<StableHashingContext<'a>> for ParamEnvAnd<'tcx, T>
1362where
1363 T: HashStable<StableHashingContext<'a>>,
ea8adc8c 1364{
e74abb32 1365 fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
dfeec247 1366 let ParamEnvAnd { ref param_env, ref value } = *self;
ea8adc8c
XL
1367
1368 param_env.hash_stable(hcx, hasher);
1369 value.hash_stable(hcx, hasher);
1370 }
1371}
1372
532ac7d7 1373#[derive(Copy, Clone, Debug, HashStable)]
8bb4bdeb 1374pub struct Destructor {
9fa01778 1375 /// The `DefId` of the destructor method
8bb4bdeb 1376 pub did: DefId,
8bb4bdeb
XL
1377}
1378
b7449926 1379bitflags! {
532ac7d7 1380 #[derive(HashStable)]
b7449926
XL
1381 pub struct VariantFlags: u32 {
1382 const NO_VARIANT_FLAGS = 0;
1383 /// Indicates whether the field list of this variant is `#[non_exhaustive]`.
1384 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1b1a35ee
XL
1385 /// Indicates whether this variant was obtained as part of recovering from
1386 /// a syntactic error. May be incomplete or bogus.
1387 const IS_RECOVERED = 1 << 1;
e9174d1e
SL
1388 }
1389}
1390
94222f64 1391/// Definition of a variant -- a struct's fields or an enum variant.
60c5eb7d 1392#[derive(Debug, HashStable)]
476ff2be 1393pub struct VariantDef {
532ac7d7
XL
1394 /// `DefId` that identifies the variant itself.
1395 /// If this variant belongs to a struct or union, then this is a copy of its `DefId`.
1396 pub def_id: DefId,
1397 /// `DefId` that identifies the variant's constructor.
1398 /// If this variant is a struct variant, then this is `None`.
1399 pub ctor_def_id: Option<DefId>,
1400 /// Variant or struct name.
60c5eb7d 1401 #[stable_hasher(project(name))]
532ac7d7
XL
1402 pub ident: Ident,
1403 /// Discriminant of this variant.
8bb4bdeb 1404 pub discr: VariantDiscr,
532ac7d7 1405 /// Fields of this variant.
476ff2be 1406 pub fields: Vec<FieldDef>,
532ac7d7 1407 /// Type of constructor of variant.
c30ab7b3 1408 pub ctor_kind: CtorKind,
532ac7d7 1409 /// Flags of the variant (e.g. is field list non-exhaustive)?
b7449926 1410 flags: VariantFlags,
e9174d1e
SL
1411}
1412
1b1a35ee 1413impl VariantDef {
9fa01778 1414 /// Creates a new `VariantDef`.
b7449926 1415 ///
532ac7d7
XL
1416 /// `variant_did` is the `DefId` that identifies the enum variant (if this `VariantDef`
1417 /// represents an enum variant).
1418 ///
1419 /// `ctor_did` is the `DefId` that identifies the constructor of unit or
1420 /// tuple-variants/structs. If this is a `struct`-variant then this should be `None`.
0bf4aa26 1421 ///
532ac7d7
XL
1422 /// `parent_did` is the `DefId` of the `AdtDef` representing the enum or struct that
1423 /// owns this variant. It is used for checking if a struct has `#[non_exhaustive]` w/out having
1424 /// to go through the redirect of checking the ctor's attributes - but compiling a small crate
1425 /// requires loading the `AdtDef`s for all the structs in the universe (e.g., coherence for any
0bf4aa26
XL
1426 /// built-in trait), and we do not want to load attributes twice.
1427 ///
1428 /// If someone speeds up attribute loading to not be a performance concern, they can
9fa01778 1429 /// remove this hack and use the constructor `DefId` everywhere.
532ac7d7 1430 pub fn new(
532ac7d7
XL
1431 ident: Ident,
1432 variant_did: Option<DefId>,
1433 ctor_def_id: Option<DefId>,
1434 discr: VariantDiscr,
1435 fields: Vec<FieldDef>,
1436 ctor_kind: CtorKind,
1437 adt_kind: AdtKind,
1438 parent_did: DefId,
1439 recovered: bool,
3dfed10e 1440 is_field_list_non_exhaustive: bool,
532ac7d7
XL
1441 ) -> Self {
1442 debug!(
1443 "VariantDef::new(ident = {:?}, variant_did = {:?}, ctor_def_id = {:?}, discr = {:?},
1444 fields = {:?}, ctor_kind = {:?}, adt_kind = {:?}, parent_did = {:?})",
dfeec247 1445 ident, variant_did, ctor_def_id, discr, fields, ctor_kind, adt_kind, parent_did,
532ac7d7
XL
1446 );
1447
b7449926 1448 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
3dfed10e
XL
1449 if is_field_list_non_exhaustive {
1450 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
b7449926 1451 }
532ac7d7 1452
1b1a35ee
XL
1453 if recovered {
1454 flags |= VariantFlags::IS_RECOVERED;
1455 }
1456
b7449926 1457 VariantDef {
532ac7d7
XL
1458 def_id: variant_did.unwrap_or(parent_did),
1459 ctor_def_id,
0731742a 1460 ident,
b7449926
XL
1461 discr,
1462 fields,
1463 ctor_kind,
532ac7d7 1464 flags,
b7449926
XL
1465 }
1466 }
1467
532ac7d7 1468 /// Is this field list non-exhaustive?
b7449926
XL
1469 #[inline]
1470 pub fn is_field_list_non_exhaustive(&self) -> bool {
1471 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1472 }
f035d41b 1473
1b1a35ee
XL
1474 /// Was this variant obtained as part of recovering from a syntactic error?
1475 #[inline]
1476 pub fn is_recovered(&self) -> bool {
1477 self.flags.intersects(VariantFlags::IS_RECOVERED)
f035d41b 1478 }
b7449926
XL
1479}
1480
3dfed10e 1481#[derive(Copy, Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)]
8bb4bdeb 1482pub enum VariantDiscr {
0731742a 1483 /// Explicit value for this variant, i.e., `X = 123`.
8bb4bdeb
XL
1484 /// The `DefId` corresponds to the embedded constant.
1485 Explicit(DefId),
1486
1487 /// The previous variant's discriminant plus one.
1488 /// For efficiency reasons, the distance from the
1489 /// last `Explicit` discriminant is being stored,
1490 /// or `0` for the first variant, if it has none.
a1dfa0c6 1491 Relative(u32),
8bb4bdeb
XL
1492}
1493
532ac7d7 1494#[derive(Debug, HashStable)]
476ff2be 1495pub struct FieldDef {
e9174d1e 1496 pub did: DefId,
532ac7d7 1497 #[stable_hasher(project(name))]
94b46f34 1498 pub ident: Ident,
54a0048b 1499 pub vis: Visibility,
e9174d1e
SL
1500}
1501
cc61c64b 1502bitflags! {
3dfed10e 1503 #[derive(TyEncodable, TyDecodable, Default, HashStable)]
ea8adc8c
XL
1504 pub struct ReprFlags: u8 {
1505 const IS_C = 1 << 0;
83c7162d
XL
1506 const IS_SIMD = 1 << 1;
1507 const IS_TRANSPARENT = 1 << 2;
cc61c64b 1508 // Internal only for now. If true, don't reorder fields.
83c7162d 1509 const IS_LINEAR = 1 << 3;
74b04a01
XL
1510 // If true, don't expose any niche to type's context.
1511 const HIDE_NICHE = 1 << 4;
cc61c64b
XL
1512 // Any of these flags being set prevent field reordering optimisation.
1513 const IS_UNOPTIMISABLE = ReprFlags::IS_C.bits |
cc61c64b 1514 ReprFlags::IS_SIMD.bits |
ea8adc8c 1515 ReprFlags::IS_LINEAR.bits;
cc61c64b
XL
1516 }
1517}
1518
8bb4bdeb 1519/// Represents the repr options provided by the user,
3dfed10e 1520#[derive(Copy, Clone, Debug, Eq, PartialEq, TyEncodable, TyDecodable, Default, HashStable)]
8bb4bdeb 1521pub struct ReprOptions {
8bb4bdeb 1522 pub int: Option<attr::IntType>,
e1599b0c
XL
1523 pub align: Option<Align>,
1524 pub pack: Option<Align>,
cc61c64b 1525 pub flags: ReprFlags,
8bb4bdeb
XL
1526}
1527
1528impl ReprOptions {
dc9dc135 1529 pub fn new(tcx: TyCtxt<'_>, did: DefId) -> ReprOptions {
cc61c64b
XL
1530 let mut flags = ReprFlags::empty();
1531 let mut size = None;
e1599b0c
XL
1532 let mut max_align: Option<Align> = None;
1533 let mut min_pack: Option<Align> = None;
8bb4bdeb 1534 for attr in tcx.get_attrs(did).iter() {
3dfed10e 1535 for r in attr::find_repr_attrs(&tcx.sess, attr) {
cc61c64b 1536 flags.insert(match r {
2c00a5a8 1537 attr::ReprC => ReprFlags::IS_C,
83c7162d 1538 attr::ReprPacked(pack) => {
e1599b0c
XL
1539 let pack = Align::from_bytes(pack as u64).unwrap();
1540 min_pack = Some(if let Some(min_pack) = min_pack {
1541 min_pack.min(pack)
83c7162d
XL
1542 } else {
1543 pack
e1599b0c 1544 });
83c7162d 1545 ReprFlags::empty()
dfeec247 1546 }
2c00a5a8 1547 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
74b04a01 1548 attr::ReprNoNiche => ReprFlags::HIDE_NICHE,
cc61c64b
XL
1549 attr::ReprSimd => ReprFlags::IS_SIMD,
1550 attr::ReprInt(i) => {
1551 size = Some(i);
1552 ReprFlags::empty()
dfeec247 1553 }
cc61c64b 1554 attr::ReprAlign(align) => {
e1599b0c 1555 max_align = max_align.max(Some(Align::from_bytes(align as u64).unwrap()));
cc61c64b 1556 ReprFlags::empty()
dfeec247 1557 }
cc61c64b 1558 });
8bb4bdeb
XL
1559 }
1560 }
1561
cc61c64b 1562 // This is here instead of layout because the choice must make it into metadata.
532ac7d7 1563 if !tcx.consider_optimizing(|| format!("Reorder fields of {:?}", tcx.def_path_str(did))) {
cc61c64b
XL
1564 flags.insert(ReprFlags::IS_LINEAR);
1565 }
74b04a01 1566 ReprOptions { int: size, align: max_align, pack: min_pack, flags }
8bb4bdeb
XL
1567 }
1568
cc61c64b 1569 #[inline]
dfeec247
XL
1570 pub fn simd(&self) -> bool {
1571 self.flags.contains(ReprFlags::IS_SIMD)
1572 }
cc61c64b 1573 #[inline]
dfeec247
XL
1574 pub fn c(&self) -> bool {
1575 self.flags.contains(ReprFlags::IS_C)
1576 }
cc61c64b 1577 #[inline]
dfeec247
XL
1578 pub fn packed(&self) -> bool {
1579 self.pack.is_some()
1580 }
cc61c64b 1581 #[inline]
dfeec247
XL
1582 pub fn transparent(&self) -> bool {
1583 self.flags.contains(ReprFlags::IS_TRANSPARENT)
1584 }
2c00a5a8 1585 #[inline]
dfeec247
XL
1586 pub fn linear(&self) -> bool {
1587 self.flags.contains(ReprFlags::IS_LINEAR)
1588 }
74b04a01
XL
1589 #[inline]
1590 pub fn hide_niche(&self) -> bool {
1591 self.flags.contains(ReprFlags::HIDE_NICHE)
1592 }
cc61c64b 1593
f9f354fc
XL
1594 /// Returns the discriminant type, given these `repr` options.
1595 /// This must only be called on enums!
8bb4bdeb 1596 pub fn discr_type(&self) -> attr::IntType {
2c00a5a8 1597 self.int.unwrap_or(attr::SignedInt(ast::IntTy::Isize))
8bb4bdeb
XL
1598 }
1599
a1dfa0c6 1600 /// Returns `true` if this `#[repr()]` should inhabit "smart enum
8bb4bdeb
XL
1601 /// layout" optimizations, such as representing `Foo<&T>` as a
1602 /// single pointer.
1603 pub fn inhibit_enum_layout_opt(&self) -> bool {
cc61c64b 1604 self.c() || self.int.is_some()
8bb4bdeb 1605 }
83c7162d 1606
a1dfa0c6 1607 /// Returns `true` if this `#[repr()]` should inhibit struct field reordering
9fa01778 1608 /// optimizations, such as with `repr(C)`, `repr(packed(1))`, or `repr(<int>)`.
83c7162d 1609 pub fn inhibit_struct_field_reordering_opt(&self) -> bool {
e1599b0c
XL
1610 if let Some(pack) = self.pack {
1611 if pack.bytes() == 1 {
1612 return true;
1613 }
1614 }
1615 self.flags.intersects(ReprFlags::IS_UNOPTIMISABLE) || self.int.is_some()
83c7162d 1616 }
a1dfa0c6 1617
9fa01778 1618 /// Returns `true` if this `#[repr()]` should inhibit union ABI optimisations.
a1dfa0c6
XL
1619 pub fn inhibit_union_abi_opt(&self) -> bool {
1620 self.c()
1621 }
8bb4bdeb
XL
1622}
1623
dc9dc135 1624impl<'tcx> FieldDef {
416331ca
XL
1625 /// Returns the type of this field. The `subst` is typically obtained
1626 /// via the second field of `TyKind::AdtDef`.
dc9dc135 1627 pub fn ty(&self, tcx: TyCtxt<'tcx>, subst: SubstsRef<'tcx>) -> Ty<'tcx> {
7cac9316 1628 tcx.type_of(self.did).subst(tcx, subst)
e9174d1e 1629 }
e9174d1e
SL
1630}
1631
ba9703b0 1632pub type Attributes<'tcx> = &'tcx [ast::Attribute];
cc61c64b 1633
0731742a
XL
1634#[derive(Debug, PartialEq, Eq)]
1635pub enum ImplOverlapKind {
1636 /// These impls are always allowed to overlap.
dfeec247 1637 Permitted {
74b04a01 1638 /// Whether or not the impl is permitted due to the trait being a `#[marker]` trait
dfeec247
XL
1639 marker: bool,
1640 },
0731742a
XL
1641 /// These impls are allowed to overlap, but that raises
1642 /// an issue #33140 future-compatibility warning.
1643 ///
1644 /// Some background: in Rust 1.0, the trait-object types `Send + Sync` (today's
1645 /// `dyn Send + Sync`) and `Sync + Send` (now `dyn Sync + Send`) were different.
1646 ///
1647 /// The widely-used version 0.1.0 of the crate `traitobject` had accidentally relied
1648 /// that difference, making what reduces to the following set of impls:
1649 ///
1650 /// ```
1651 /// trait Trait {}
1652 /// impl Trait for dyn Send + Sync {}
1653 /// impl Trait for dyn Sync + Send {}
1654 /// ```
1655 ///
1656 /// Obviously, once we made these types be identical, that code causes a coherence
1657 /// error and a fairly big headache for us. However, luckily for us, the trait
1658 /// `Trait` used in this case is basically a marker trait, and therefore having
1659 /// overlapping impls for it is sound.
1660 ///
1661 /// To handle this, we basically regard the trait as a marker trait, with an additional
1662 /// future-compatibility warning. To avoid accidentally "stabilizing" this feature,
1663 /// it has the following restrictions:
1664 ///
1665 /// 1. The trait must indeed be a marker-like trait (i.e., no items), and must be
1666 /// positive impls.
1667 /// 2. The trait-ref of both impls must be equal.
1668 /// 3. The trait-ref of both impls must be a trait object type consisting only of
1669 /// marker traits.
1670 /// 4. Neither of the impls can have any where-clauses.
1671 ///
1672 /// Once `traitobject` 0.1.0 is no longer an active concern, this hack can be removed.
dfeec247 1673 Issue33140,
0731742a
XL
1674}
1675
dc9dc135 1676impl<'tcx> TyCtxt<'tcx> {
3dfed10e
XL
1677 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1678 self.typeck(self.hir().body_owner_def_id(body))
32a655c1
SL
1679 }
1680
9fa01778 1681 /// Returns an iterator of the `DefId`s for all body-owners in this
7cac9316 1682 /// crate. If you would prefer to iterate over the bodies
0731742a 1683 /// themselves, you can do `self.hir().krate().body_ids.iter()`.
ba9703b0 1684 pub fn body_owners(self) -> impl Iterator<Item = LocalDefId> + Captures<'tcx> + 'tcx {
94222f64 1685 self.hir().krate().bodies.keys().map(move |&body_id| self.hir().body_owner_def_id(body_id))
7453a54e
SL
1686 }
1687
ba9703b0 1688 pub fn par_body_owners<F: Fn(LocalDefId) + sync::Sync + sync::Send>(self, f: F) {
94222f64
XL
1689 par_iter(&self.hir().krate().bodies)
1690 .for_each(|(&body_id, _)| f(self.hir().body_owner_def_id(body_id)));
94b46f34
XL
1691 }
1692
74b04a01 1693 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
476ff2be 1694 self.associated_items(id)
74b04a01 1695 .in_definition_order()
ba9703b0 1696 .filter(|item| item.kind == AssocKind::Fn && item.defaultness.has_value())
e9174d1e
SL
1697 }
1698
29967ef6
XL
1699 fn item_name_from_hir(self, def_id: DefId) -> Option<Ident> {
1700 self.hir().get_if_local(def_id).and_then(|node| node.ident())
1701 }
1702
1703 fn item_name_from_def_id(self, def_id: DefId) -> Option<Symbol> {
1704 if def_id.index == CRATE_DEF_INDEX {
17df50a5 1705 Some(self.crate_name(def_id.krate))
29967ef6
XL
1706 } else {
1707 let def_key = self.def_key(def_id);
1708 match def_key.disambiguated_data.data {
1709 // The name of a constructor is that of its parent.
1710 rustc_hir::definitions::DefPathData::Ctor => self.item_name_from_def_id(DefId {
1711 krate: def_id.krate,
1712 index: def_key.parent.unwrap(),
1713 }),
1714 _ => def_key.disambiguated_data.data.get_opt_name(),
1715 }
1716 }
1717 }
1718
1719 /// Look up the name of an item across crates. This does not look at HIR.
1720 ///
1721 /// When possible, this function should be used for cross-crate lookups over
1722 /// [`opt_item_name`] to avoid invalidating the incremental cache. If you
1723 /// need to handle items without a name, or HIR items that will not be
1724 /// serialized cross-crate, or if you need the span of the item, use
1725 /// [`opt_item_name`] instead.
1726 ///
1727 /// [`opt_item_name`]: Self::opt_item_name
1728 pub fn item_name(self, id: DefId) -> Symbol {
1729 // Look at cross-crate items first to avoid invalidating the incremental cache
1730 // unless we have to.
1731 self.item_name_from_def_id(id).unwrap_or_else(|| {
1732 bug!("item_name: no name for {:?}", self.def_path(id));
1733 })
1734 }
1735
1736 /// Look up the name and span of an item or [`Node`].
1737 ///
1738 /// See [`item_name`][Self::item_name] for more information.
e1599b0c 1739 pub fn opt_item_name(self, def_id: DefId) -> Option<Ident> {
29967ef6
XL
1740 // Look at the HIR first so the span will be correct if this is a local item.
1741 self.item_name_from_hir(def_id)
1742 .or_else(|| self.item_name_from_def_id(def_id).map(Ident::with_dummy_span))
e1599b0c
XL
1743 }
1744
f9f354fc 1745 pub fn opt_associated_item(self, def_id: DefId) -> Option<&'tcx AssocItem> {
5869c6ff
XL
1746 if let DefKind::AssocConst | DefKind::AssocFn | DefKind::AssocTy = self.def_kind(def_id) {
1747 Some(self.associated_item(def_id))
7cac9316 1748 } else {
5869c6ff
XL
1749 None
1750 }
e9174d1e
SL
1751 }
1752
3dfed10e
XL
1753 pub fn field_index(self, hir_id: hir::HirId, typeck_results: &TypeckResults<'_>) -> usize {
1754 typeck_results.field_indices().get(hir_id).cloned().expect("no index for a field")
83c7162d
XL
1755 }
1756
1757 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<usize> {
dfeec247 1758 variant.fields.iter().position(|field| self.hygienic_eq(ident, field.ident, variant.def_id))
83c7162d
XL
1759 }
1760
a1dfa0c6 1761 /// Returns `true` if the impls are the same polarity and the trait either
f9f354fc 1762 /// has no items or is annotated `#[marker]` and prevents item overrides.
dfeec247
XL
1763 pub fn impls_are_allowed_to_overlap(
1764 self,
1765 def_id1: DefId,
1766 def_id2: DefId,
1767 ) -> Option<ImplOverlapKind> {
e1599b0c
XL
1768 // If either trait impl references an error, they're allowed to overlap,
1769 // as one of them essentially doesn't exist.
dfeec247
XL
1770 if self.impl_trait_ref(def_id1).map_or(false, |tr| tr.references_error())
1771 || self.impl_trait_ref(def_id2).map_or(false, |tr| tr.references_error())
1772 {
1773 return Some(ImplOverlapKind::Permitted { marker: false });
e1599b0c
XL
1774 }
1775
e74abb32 1776 match (self.impl_polarity(def_id1), self.impl_polarity(def_id2)) {
dfeec247 1777 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
e74abb32 1778 // `#[rustc_reservation_impl]` impls don't overlap with anything
dfeec247
XL
1779 debug!(
1780 "impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (reservations)",
1781 def_id1, def_id2
1782 );
1783 return Some(ImplOverlapKind::Permitted { marker: false });
e74abb32 1784 }
dfeec247
XL
1785 (ImplPolarity::Positive, ImplPolarity::Negative)
1786 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
e74abb32 1787 // `impl AutoTrait for Type` + `impl !AutoTrait for Type`
dfeec247
XL
1788 debug!(
1789 "impls_are_allowed_to_overlap({:?}, {:?}) - None (differing polarities)",
1790 def_id1, def_id2
1791 );
e74abb32
XL
1792 return None;
1793 }
dfeec247
XL
1794 (ImplPolarity::Positive, ImplPolarity::Positive)
1795 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
e74abb32
XL
1796 };
1797
74b04a01 1798 let is_marker_overlap = {
0bf4aa26
XL
1799 let is_marker_impl = |def_id: DefId| -> bool {
1800 let trait_ref = self.impl_trait_ref(def_id);
1801 trait_ref.map_or(false, |tr| self.trait_def(tr.def_id).is_marker)
1802 };
e74abb32 1803 is_marker_impl(def_id1) && is_marker_impl(def_id2)
0731742a
XL
1804 };
1805
e74abb32 1806 if is_marker_overlap {
dfeec247
XL
1807 debug!(
1808 "impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (marker overlap)",
1809 def_id1, def_id2
1810 );
1811 Some(ImplOverlapKind::Permitted { marker: true })
0bf4aa26 1812 } else {
0731742a
XL
1813 if let Some(self_ty1) = self.issue33140_self_ty(def_id1) {
1814 if let Some(self_ty2) = self.issue33140_self_ty(def_id2) {
1815 if self_ty1 == self_ty2 {
dfeec247
XL
1816 debug!(
1817 "impls_are_allowed_to_overlap({:?}, {:?}) - issue #33140 HACK",
1818 def_id1, def_id2
1819 );
0731742a
XL
1820 return Some(ImplOverlapKind::Issue33140);
1821 } else {
dfeec247
XL
1822 debug!(
1823 "impls_are_allowed_to_overlap({:?}, {:?}) - found {:?} != {:?}",
1824 def_id1, def_id2, self_ty1, self_ty2
1825 );
0731742a
XL
1826 }
1827 }
1828 }
1829
dfeec247 1830 debug!("impls_are_allowed_to_overlap({:?}, {:?}) = None", def_id1, def_id2);
0731742a 1831 None
cc61c64b 1832 }
cc61c64b
XL
1833 }
1834
48663c56 1835 /// Returns `ty::VariantDef` if `res` refers to a struct,
532ac7d7 1836 /// or variant or their constructors, panics otherwise.
48663c56
XL
1837 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1838 match res {
1839 Res::Def(DefKind::Variant, did) => {
532ac7d7 1840 let enum_did = self.parent(did).unwrap();
7cac9316 1841 self.adt_def(enum_did).variant_with_id(did)
5bcae85e 1842 }
ba9703b0 1843 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
48663c56 1844 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
532ac7d7
XL
1845 let variant_did = self.parent(variant_ctor_did).unwrap();
1846 let enum_did = self.parent(variant_did).unwrap();
1847 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1848 }
48663c56 1849 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
532ac7d7
XL
1850 let struct_did = self.parent(ctor_did).expect("struct ctor has no parent");
1851 self.adt_def(struct_did).non_enum_variant()
c30ab7b3 1852 }
dfeec247 1853 _ => bug!("expect_variant_res used with unexpected res {:?}", res),
5bcae85e
SL
1854 }
1855 }
1856
9fa01778 1857 /// Returns the possibly-auto-generated MIR of a `(DefId, Subst)` pair.
f9f354fc 1858 pub fn instance_mir(self, instance: ty::InstanceDef<'tcx>) -> &'tcx Body<'tcx> {
cc61c64b 1859 match instance {
5869c6ff
XL
1860 ty::InstanceDef::Item(def) => match self.def_kind(def.did) {
1861 DefKind::Const
1862 | DefKind::Static
1863 | DefKind::AssocConst
1864 | DefKind::Ctor(..)
1865 | DefKind::AnonConst => self.mir_for_ctfe_opt_const_arg(def),
1866 // If the caller wants `mir_for_ctfe` of a function they should not be using
1867 // `instance_mir`, so we'll assume const fn also wants the optimized version.
6a06907d
XL
1868 _ => {
1869 assert_eq!(def.const_param_did, None);
1870 self.optimized_mir(def.did)
1871 }
5869c6ff 1872 },
dfeec247
XL
1873 ty::InstanceDef::VtableShim(..)
1874 | ty::InstanceDef::ReifyShim(..)
1875 | ty::InstanceDef::Intrinsic(..)
1876 | ty::InstanceDef::FnPtrShim(..)
1877 | ty::InstanceDef::Virtual(..)
1878 | ty::InstanceDef::ClosureOnceShim { .. }
1879 | ty::InstanceDef::DropGlue(..)
f9f354fc 1880 | ty::InstanceDef::CloneShim(..) => self.mir_shims(instance),
cc61c64b
XL
1881 }
1882 }
1883
9fa01778 1884 /// Gets the attributes of a definition.
dc9dc135 1885 pub fn get_attrs(self, did: DefId) -> Attributes<'tcx> {
f9f354fc 1886 if let Some(did) = did.as_local() {
3dfed10e 1887 self.hir().attrs(self.hir().local_def_id_to_hir_id(did))
e9174d1e 1888 } else {
ba9703b0 1889 self.item_attrs(did)
e9174d1e
SL
1890 }
1891 }
1892
9fa01778 1893 /// Determines whether an item is annotated with an attribute.
48663c56 1894 pub fn has_attr(self, did: DefId, attr: Symbol) -> bool {
3dfed10e 1895 self.sess.contains_name(&self.get_attrs(did), attr)
e9174d1e
SL
1896 }
1897
a1dfa0c6 1898 /// Returns `true` if this is an `auto trait`.
abe05a73
XL
1899 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1900 self.trait_def(trait_def_id).has_auto_impl
b039eaaf
SL
1901 }
1902
5869c6ff
XL
1903 /// Returns layout of a generator. Layout might be unavailable if the
1904 /// generator is tainted by errors.
1905 pub fn generator_layout(self, def_id: DefId) -> Option<&'tcx GeneratorLayout<'tcx>> {
6a06907d 1906 self.optimized_mir(def_id).generator_layout()
ea8adc8c
XL
1907 }
1908
9fa01778
XL
1909 /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
1910 /// If it implements no trait, returns `None`.
a7813a04 1911 pub fn trait_id_of_impl(self, def_id: DefId) -> Option<DefId> {
e9174d1e
SL
1912 self.impl_trait_ref(def_id).map(|tr| tr.def_id)
1913 }
1914
9fa01778
XL
1915 /// If the given defid describes a method belonging to an impl, returns the
1916 /// `DefId` of the impl that the method belongs to; otherwise, returns `None`.
a7813a04 1917 pub fn impl_of_method(self, def_id: DefId) -> Option<DefId> {
ba9703b0 1918 self.opt_associated_item(def_id).and_then(|trait_item| match trait_item.container {
dfeec247
XL
1919 TraitContainer(_) => None,
1920 ImplContainer(def_id) => Some(def_id),
1921 })
e9174d1e
SL
1922 }
1923
54a0048b
SL
1924 /// Looks up the span of `impl_did` if the impl is local; otherwise returns `Err`
1925 /// with the name of the crate containing the impl.
476ff2be 1926 pub fn span_of_impl(self, impl_did: DefId) -> Result<Span, Symbol> {
f9f354fc 1927 if let Some(impl_did) = impl_did.as_local() {
3dfed10e 1928 let hir_id = self.hir().local_def_id_to_hir_id(impl_did);
dc9dc135 1929 Ok(self.hir().span(hir_id))
54a0048b 1930 } else {
ea8adc8c 1931 Err(self.crate_name(impl_did.krate))
54a0048b
SL
1932 }
1933 }
7cac9316 1934
9fa01778
XL
1935 /// Hygienically compares a use-site name (`use_name`) for a field or an associated item with
1936 /// its supposed definition name (`def_name`). The method also needs `DefId` of the supposed
1937 /// definition's parent/scope to perform comparison.
8faf50e0 1938 pub fn hygienic_eq(self, use_name: Ident, def_name: Ident, def_parent_def_id: DefId) -> bool {
dc9dc135
XL
1939 // We could use `Ident::eq` here, but we deliberately don't. The name
1940 // comparison fails frequently, and we want to avoid the expensive
ba9703b0 1941 // `normalize_to_macros_2_0()` calls required for the span comparison whenever possible.
dfeec247
XL
1942 use_name.name == def_name.name
1943 && use_name
1944 .span
1945 .ctxt()
17df50a5 1946 .hygienic_eq(def_name.span.ctxt(), self.expn_that_defined(def_parent_def_id))
dc9dc135
XL
1947 }
1948
1949 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
17df50a5 1950 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
dc9dc135
XL
1951 ident
1952 }
1953
dfeec247
XL
1954 pub fn adjust_ident_and_get_scope(
1955 self,
1956 mut ident: Ident,
1957 scope: DefId,
1958 block: hir::HirId,
1959 ) -> (Ident, DefId) {
136023e0
XL
1960 let scope = ident
1961 .span
1962 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
1963 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
1964 .unwrap_or_else(|| self.parent_module(block).to_def_id());
7cac9316
XL
1965 (ident, scope)
1966 }
a1dfa0c6 1967
74b04a01
XL
1968 pub fn is_object_safe(self, key: DefId) -> bool {
1969 self.object_safety_violations(key).is_empty()
a1dfa0c6
XL
1970 }
1971}
1972
a1dfa0c6 1973/// Yields the parent function's `DefId` if `def_id` is an `impl Trait` definition.
dc9dc135 1974pub fn is_impl_trait_defn(tcx: TyCtxt<'_>, def_id: DefId) -> Option<DefId> {
f9f354fc 1975 if let Some(def_id) = def_id.as_local() {
3dfed10e 1976 if let Node::Item(item) = tcx.hir().get(tcx.hir().local_def_id_to_hir_id(def_id)) {
e74abb32 1977 if let hir::ItemKind::OpaqueTy(ref opaque_ty) = item.kind {
416331ca 1978 return opaque_ty.impl_trait_fn;
8faf50e0
XL
1979 }
1980 }
1981 }
1982 None
1983}
1984
5869c6ff
XL
1985pub fn int_ty(ity: ast::IntTy) -> IntTy {
1986 match ity {
1987 ast::IntTy::Isize => IntTy::Isize,
1988 ast::IntTy::I8 => IntTy::I8,
1989 ast::IntTy::I16 => IntTy::I16,
1990 ast::IntTy::I32 => IntTy::I32,
1991 ast::IntTy::I64 => IntTy::I64,
1992 ast::IntTy::I128 => IntTy::I128,
1993 }
1994}
1995
1996pub fn uint_ty(uty: ast::UintTy) -> UintTy {
1997 match uty {
1998 ast::UintTy::Usize => UintTy::Usize,
1999 ast::UintTy::U8 => UintTy::U8,
2000 ast::UintTy::U16 => UintTy::U16,
2001 ast::UintTy::U32 => UintTy::U32,
2002 ast::UintTy::U64 => UintTy::U64,
2003 ast::UintTy::U128 => UintTy::U128,
2004 }
2005}
2006
2007pub fn float_ty(fty: ast::FloatTy) -> FloatTy {
2008 match fty {
2009 ast::FloatTy::F32 => FloatTy::F32,
2010 ast::FloatTy::F64 => FloatTy::F64,
2011 }
2012}
2013
2014pub fn ast_int_ty(ity: IntTy) -> ast::IntTy {
2015 match ity {
2016 IntTy::Isize => ast::IntTy::Isize,
2017 IntTy::I8 => ast::IntTy::I8,
2018 IntTy::I16 => ast::IntTy::I16,
2019 IntTy::I32 => ast::IntTy::I32,
2020 IntTy::I64 => ast::IntTy::I64,
2021 IntTy::I128 => ast::IntTy::I128,
2022 }
2023}
2024
2025pub fn ast_uint_ty(uty: UintTy) -> ast::UintTy {
2026 match uty {
2027 UintTy::Usize => ast::UintTy::Usize,
2028 UintTy::U8 => ast::UintTy::U8,
2029 UintTy::U16 => ast::UintTy::U16,
2030 UintTy::U32 => ast::UintTy::U32,
2031 UintTy::U64 => ast::UintTy::U64,
2032 UintTy::U128 => ast::UintTy::U128,
2033 }
2034}
2035
f035d41b 2036pub fn provide(providers: &mut ty::query::Providers) {
94222f64 2037 closure::provide(providers);
ea8adc8c 2038 context::provide(providers);
abe05a73 2039 erase_regions::provide(providers);
ff7c6d11 2040 layout::provide(providers);
3dfed10e 2041 util::provide(providers);
1b1a35ee 2042 print::provide(providers);
ba9703b0 2043 super::util::bug::provide(providers);
136023e0 2044 super::middle::provide(providers);
ba9703b0
XL
2045 *providers = ty::query::Providers {
2046 trait_impls_of: trait_def::trait_impls_of_provider,
5869c6ff 2047 type_uninhabited_from: inhabitedness::type_uninhabited_from,
cdc7bbd5 2048 const_param_default: consts::const_param_default,
dc3f5686 2049 vtable_allocation: vtable::vtable_allocation_provider,
ba9703b0
XL
2050 ..*providers
2051 };
cc61c64b
XL
2052}
2053
cc61c64b
XL
2054/// A map for the local crate mapping each type to a vector of its
2055/// inherent impls. This is not meant to be used outside of coherence;
2056/// rather, you should request the vector for a specific type via
7cac9316
XL
2057/// `tcx.inherent_impls(def_id)` so as to minimize your dependencies
2058/// (constructing this map requires touching the entire crate).
532ac7d7 2059#[derive(Clone, Debug, Default, HashStable)]
cc61c64b 2060pub struct CrateInherentImpls {
17df50a5 2061 pub inherent_impls: LocalDefIdMap<Vec<DefId>>,
cc61c64b
XL
2062}
2063
3dfed10e
XL
2064#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TyEncodable, HashStable)]
2065pub struct SymbolName<'tcx> {
2066 /// `&str` gives a consistent ordering, which ensures reproducible builds.
2067 pub name: &'tcx str,
7cac9316
XL
2068}
2069
3dfed10e
XL
2070impl<'tcx> SymbolName<'tcx> {
2071 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2072 SymbolName {
2073 name: unsafe { str::from_utf8_unchecked(tcx.arena.alloc_slice(name.as_bytes())) },
2074 }
e74abb32
XL
2075 }
2076}
2077
3dfed10e 2078impl<'tcx> fmt::Display for SymbolName<'tcx> {
0bf4aa26 2079 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
7cac9316
XL
2080 fmt::Display::fmt(&self.name, fmt)
2081 }
2082}
0531ce1d 2083
3dfed10e 2084impl<'tcx> fmt::Debug for SymbolName<'tcx> {
0bf4aa26 2085 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
0531ce1d
XL
2086 fmt::Display::fmt(&self.name, fmt)
2087 }
2088}