summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_middle/src/ty/context.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_middle/src/ty/context.rs')
-rw-r--r--compiler/rustc_middle/src/ty/context.rs142
1 files changed, 89 insertions, 53 deletions
diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs
index c06b8b2df..551c4a15d 100644
--- a/compiler/rustc_middle/src/ty/context.rs
+++ b/compiler/rustc_middle/src/ty/context.rs
@@ -6,7 +6,7 @@ pub mod tls;
use crate::arena::Arena;
use crate::dep_graph::{DepGraph, DepKindStruct};
-use crate::infer::canonical::CanonicalVarInfo;
+use crate::infer::canonical::{CanonicalVarInfo, CanonicalVarInfos};
use crate::lint::struct_lint_level;
use crate::metadata::ModChild;
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
@@ -65,7 +65,7 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{Span, DUMMY_SP};
use rustc_target::abi::{FieldIdx, Layout, LayoutS, TargetDataLayout, VariantIdx};
use rustc_target::spec::abi;
-use rustc_type_ir::sty::TyKind::*;
+use rustc_type_ir::TyKind::*;
use rustc_type_ir::WithCachedTypeInfo;
use rustc_type_ir::{CollectAndApply, Interner, TypeFlags};
@@ -80,54 +80,59 @@ use std::ops::{Bound, Deref};
#[allow(rustc::usage_of_ty_tykind)]
impl<'tcx> Interner for TyCtxt<'tcx> {
+ type DefId = DefId;
type AdtDef = ty::AdtDef<'tcx>;
- type GenericArgsRef = ty::GenericArgsRef<'tcx>;
+ type GenericArgs = ty::GenericArgsRef<'tcx>;
type GenericArg = ty::GenericArg<'tcx>;
- type DefId = DefId;
+ type Term = ty::Term<'tcx>;
+
type Binder<T> = Binder<'tcx, T>;
- type Ty = Ty<'tcx>;
- type Const = ty::Const<'tcx>;
- type Region = Region<'tcx>;
- type Predicate = Predicate<'tcx>;
type TypeAndMut = TypeAndMut<'tcx>;
- type Mutability = hir::Mutability;
- type Movability = hir::Movability;
- type PolyFnSig = PolyFnSig<'tcx>;
- type ListBinderExistentialPredicate = &'tcx List<PolyExistentialPredicate<'tcx>>;
- type BinderListTy = Binder<'tcx, &'tcx List<Ty<'tcx>>>;
- type ListTy = &'tcx List<Ty<'tcx>>;
+ type CanonicalVars = CanonicalVarInfos<'tcx>;
+
+ type Ty = Ty<'tcx>;
+ type Tys = &'tcx List<Ty<'tcx>>;
type AliasTy = ty::AliasTy<'tcx>;
type ParamTy = ParamTy;
type BoundTy = ty::BoundTy;
- type PlaceholderType = ty::PlaceholderType;
+ type PlaceholderTy = ty::PlaceholderType;
type InferTy = InferTy;
+
type ErrorGuaranteed = ErrorGuaranteed;
- type PredicateKind = ty::PredicateKind<'tcx>;
+ type BoundExistentialPredicates = &'tcx List<PolyExistentialPredicate<'tcx>>;
+ type PolyFnSig = PolyFnSig<'tcx>;
type AllocId = crate::mir::interpret::AllocId;
- type InferConst = ty::InferConst<'tcx>;
+ type Const = ty::Const<'tcx>;
+ type InferConst = ty::InferConst;
type AliasConst = ty::UnevaluatedConst<'tcx>;
+ type PlaceholderConst = ty::PlaceholderConst;
type ParamConst = ty::ParamConst;
type BoundConst = ty::BoundVar;
- type PlaceholderConst = ty::PlaceholderConst<'tcx>;
type ValueConst = ty::ValTree<'tcx>;
type ExprConst = ty::Expr<'tcx>;
+ type Region = Region<'tcx>;
type EarlyBoundRegion = ty::EarlyBoundRegion;
type BoundRegion = ty::BoundRegion;
type FreeRegion = ty::FreeRegion;
- type RegionVid = ty::RegionVid;
+ type InferRegion = ty::RegionVid;
type PlaceholderRegion = ty::PlaceholderRegion;
+ type Predicate = Predicate<'tcx>;
+ type TraitPredicate = ty::TraitPredicate<'tcx>;
+ type RegionOutlivesPredicate = ty::RegionOutlivesPredicate<'tcx>;
+ type TypeOutlivesPredicate = ty::TypeOutlivesPredicate<'tcx>;
+ type ProjectionPredicate = ty::ProjectionPredicate<'tcx>;
+ type SubtypePredicate = ty::SubtypePredicate<'tcx>;
+ type CoercePredicate = ty::CoercePredicate<'tcx>;
+ type ClosureKind = ty::ClosureKind;
+
fn ty_and_mut_to_parts(
TypeAndMut { ty, mutbl }: TypeAndMut<'tcx>,
- ) -> (Self::Ty, Self::Mutability) {
+ ) -> (Self::Ty, ty::Mutability) {
(ty, mutbl)
}
-
- fn mutability_is_mut(mutbl: Self::Mutability) -> bool {
- mutbl.is_mut()
- }
}
type InternedSet<'tcx, T> = ShardedHashMap<InternedInSet<'tcx, T>, ()>;
@@ -152,11 +157,13 @@ pub struct CtxtInterners<'tcx> {
const_: InternedSet<'tcx, ConstData<'tcx>>,
const_allocation: InternedSet<'tcx, Allocation>,
bound_variable_kinds: InternedSet<'tcx, List<ty::BoundVariableKind>>,
- layout: InternedSet<'tcx, LayoutS>,
+ layout: InternedSet<'tcx, LayoutS<FieldIdx, VariantIdx>>,
adt_def: InternedSet<'tcx, AdtDefData>,
external_constraints: InternedSet<'tcx, ExternalConstraintsData<'tcx>>,
predefined_opaques_in_body: InternedSet<'tcx, PredefinedOpaquesData<'tcx>>,
fields: InternedSet<'tcx, List<FieldIdx>>,
+ local_def_ids: InternedSet<'tcx, List<LocalDefId>>,
+ offset_of: InternedSet<'tcx, List<(VariantIdx, FieldIdx)>>,
}
impl<'tcx> CtxtInterners<'tcx> {
@@ -182,6 +189,8 @@ impl<'tcx> CtxtInterners<'tcx> {
external_constraints: Default::default(),
predefined_opaques_in_body: Default::default(),
fields: Default::default(),
+ local_def_ids: Default::default(),
+ offset_of: Default::default(),
}
}
@@ -770,9 +779,20 @@ impl<'tcx> TyCtxt<'tcx> {
self.diagnostic_items(did.krate).name_to_id.get(&name) == Some(&did)
}
- /// Returns `true` if the node pointed to by `def_id` is a generator for an async construct.
- pub fn generator_is_async(self, def_id: DefId) -> bool {
- matches!(self.generator_kind(def_id), Some(hir::GeneratorKind::Async(_)))
+ /// Returns `true` if the node pointed to by `def_id` is a coroutine for an async construct.
+ pub fn coroutine_is_async(self, def_id: DefId) -> bool {
+ matches!(self.coroutine_kind(def_id), Some(hir::CoroutineKind::Async(_)))
+ }
+
+ /// Returns `true` if the node pointed to by `def_id` is a general coroutine that implements `Coroutine`.
+ /// This means it is neither an `async` or `gen` construct.
+ pub fn is_general_coroutine(self, def_id: DefId) -> bool {
+ matches!(self.coroutine_kind(def_id), Some(hir::CoroutineKind::Coroutine))
+ }
+
+ /// Returns `true` if the node pointed to by `def_id` is a coroutine for a gen construct.
+ pub fn coroutine_is_gen(self, def_id: DefId) -> bool {
+ matches!(self.coroutine_kind(def_id), Some(hir::CoroutineKind::Gen(_)))
}
pub fn stability(self) -> &'tcx stability::Index {
@@ -960,7 +980,7 @@ impl<'tcx> TyCtxt<'tcx> {
self.dep_graph.read_index(DepNodeIndex::FOREVER_RED_NODE);
let definitions = &self.untracked.definitions;
- std::iter::from_generator(|| {
+ std::iter::from_coroutine(|| {
let mut i = 0;
// Recompute the number of definitions each time, because our caller may be creating
@@ -1057,16 +1077,21 @@ impl<'tcx> TyCtxt<'tcx> {
}
/// Returns the `DefId` and the `BoundRegionKind` corresponding to the given region.
- pub fn is_suitable_region(self, region: Region<'tcx>) -> Option<FreeRegionInfo> {
- let (suitable_region_binding_scope, bound_region) = match *region {
- ty::ReFree(ref free_region) => {
- (free_region.scope.expect_local(), free_region.bound_region)
+ pub fn is_suitable_region(self, mut region: Region<'tcx>) -> Option<FreeRegionInfo> {
+ let (suitable_region_binding_scope, bound_region) = loop {
+ let def_id = match region.kind() {
+ ty::ReFree(fr) => fr.bound_region.get_id()?.as_local()?,
+ ty::ReEarlyBound(ebr) => ebr.def_id.expect_local(),
+ _ => return None, // not a free region
+ };
+ let scope = self.local_parent(def_id);
+ if self.def_kind(scope) == DefKind::OpaqueTy {
+ // Lifetime params of opaque types are synthetic and thus irrelevant to
+ // diagnostics. Map them back to their origin!
+ region = self.map_rpit_lifetime_to_fn_lifetime(def_id);
+ continue;
}
- ty::ReEarlyBound(ref ebr) => (
- self.local_parent(ebr.def_id.expect_local()),
- ty::BoundRegionKind::BrNamed(ebr.def_id, ebr.name),
- ),
- _ => return None, // not a free region
+ break (scope, ty::BrNamed(def_id.into(), self.item_name(def_id.into())));
};
let is_impl_item = match self.hir().find_by_def_id(suitable_region_binding_scope) {
@@ -1074,7 +1099,7 @@ impl<'tcx> TyCtxt<'tcx> {
Some(Node::ImplItem(..)) => {
self.is_bound_region_in_impl_item(suitable_region_binding_scope)
}
- _ => return None,
+ _ => false,
};
Some(FreeRegionInfo {
@@ -1121,7 +1146,11 @@ impl<'tcx> TyCtxt<'tcx> {
{
v.visit_ty(alias_ty);
if !v.0.is_empty() {
- return Some((v.0, alias_generics.span, alias_generics.span_for_lifetime_suggestion()));
+ return Some((
+ v.0,
+ alias_generics.span,
+ alias_generics.span_for_lifetime_suggestion(),
+ ));
}
}
return None;
@@ -1382,8 +1411,8 @@ impl<'tcx> TyCtxt<'tcx> {
FnDef,
FnPtr,
Placeholder,
- Generator,
- GeneratorWitness,
+ Coroutine,
+ CoroutineWitness,
Dynamic,
Closure,
Tuple,
@@ -1521,7 +1550,7 @@ direct_interners! {
region: pub(crate) intern_region(RegionKind<'tcx>): Region -> Region<'tcx>,
const_: intern_const(ConstData<'tcx>): Const -> Const<'tcx>,
const_allocation: pub mk_const_alloc(Allocation): ConstAllocation -> ConstAllocation<'tcx>,
- layout: pub mk_layout(LayoutS): Layout -> Layout<'tcx>,
+ layout: pub mk_layout(LayoutS<FieldIdx, VariantIdx>): Layout -> Layout<'tcx>,
adt_def: pub mk_adt_def_from_data(AdtDefData): AdtDef -> AdtDef<'tcx>,
external_constraints: pub mk_external_constraints(ExternalConstraintsData<'tcx>):
ExternalConstraints -> ExternalConstraints<'tcx>,
@@ -1559,6 +1588,8 @@ slice_interners!(
place_elems: pub mk_place_elems(PlaceElem<'tcx>),
bound_variable_kinds: pub mk_bound_variable_kinds(ty::BoundVariableKind),
fields: pub mk_fields(FieldIdx),
+ local_def_ids: intern_local_def_ids(LocalDefId),
+ offset_of: pub mk_offset_of((VariantIdx, FieldIdx)),
);
impl<'tcx> TyCtxt<'tcx> {
@@ -1678,7 +1709,6 @@ impl<'tcx> TyCtxt<'tcx> {
&& let DefKind::Impl { of_trait: false } = self.def_kind(self.parent(_def_id))
{
// If this is an inherent projection.
-
generics.params.len() + 1
} else {
generics.count()
@@ -1789,6 +1819,13 @@ impl<'tcx> TyCtxt<'tcx> {
self.intern_clauses(clauses)
}
+ pub fn mk_local_def_ids(self, clauses: &[LocalDefId]) -> &'tcx List<LocalDefId> {
+ // FIXME consider asking the input slice to be sorted to avoid
+ // re-interning permutations, in which case that would be asserted
+ // here.
+ self.intern_local_def_ids(clauses)
+ }
+
pub fn mk_const_list_from_iter<I, T>(self, iter: I) -> T::Output
where
I: Iterator<Item = T>,
@@ -1880,6 +1917,14 @@ impl<'tcx> TyCtxt<'tcx> {
T::collect_and_apply(iter, |xs| self.mk_fields(xs))
}
+ pub fn mk_offset_of_from_iter<I, T>(self, iter: I) -> T::Output
+ where
+ I: Iterator<Item = T>,
+ T: CollectAndApply<(VariantIdx, FieldIdx), &'tcx List<(VariantIdx, FieldIdx)>>,
+ {
+ T::collect_and_apply(iter, |xs| self.mk_offset_of(xs))
+ }
+
pub fn mk_args_trait(
self,
self_ty: Ty<'tcx>,
@@ -1888,15 +1933,6 @@ impl<'tcx> TyCtxt<'tcx> {
self.mk_args_from_iter(iter::once(self_ty.into()).chain(rest))
}
- pub fn mk_alias_ty(
- self,
- def_id: DefId,
- args: impl IntoIterator<Item: Into<GenericArg<'tcx>>>,
- ) -> ty::AliasTy<'tcx> {
- let args = self.check_and_mk_args(def_id, args);
- ty::AliasTy { def_id, args, _use_mk_alias_ty_instead: () }
- }
-
pub fn mk_bound_variable_kinds_from_iter<I, T>(self, iter: I) -> T::Output
where
I: Iterator<Item = T>,