Rollup merge of #54789 - scalexm:unnormalized, r=nikomatsakis
Introduce `TyKind::UnnormalizedProjection` Introduce a new variant used for lazy normalization in chalk integration. Mostly `bug!` everywhere. r? @nikomatsakis
This commit is contained in:
commit
2503db8e61
@ -873,8 +873,8 @@ for ty::TyKind<'gcx>
|
||||
Tuple(inner_tys) => {
|
||||
inner_tys.hash_stable(hcx, hasher);
|
||||
}
|
||||
Projection(ref projection_ty) => {
|
||||
projection_ty.hash_stable(hcx, hasher);
|
||||
Projection(ref data) | UnnormalizedProjection(ref data) => {
|
||||
data.hash_stable(hcx, hasher);
|
||||
}
|
||||
Opaque(def_id, substs) => {
|
||||
def_id.hash_stable(hcx, hasher);
|
||||
|
@ -283,6 +283,7 @@ impl<'cx, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for Canonicalizer<'cx, 'gcx, 'tcx>
|
||||
| ty::Never
|
||||
| ty::Tuple(..)
|
||||
| ty::Projection(..)
|
||||
| ty::UnnormalizedProjection(..)
|
||||
| ty::Foreign(..)
|
||||
| ty::Param(..)
|
||||
| ty::Opaque(..) => {
|
||||
|
@ -193,6 +193,7 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for TypeFreshener<'a, 'gcx, 'tcx> {
|
||||
ty::Never |
|
||||
ty::Tuple(..) |
|
||||
ty::Projection(..) |
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Foreign(..) |
|
||||
ty::Param(..) |
|
||||
ty::Closure(..) |
|
||||
|
@ -475,6 +475,7 @@ fn ty_is_local_constructor(ty: Ty<'_>, in_crate: InCrate) -> bool {
|
||||
|
||||
ty::Error => true,
|
||||
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Closure(..) |
|
||||
ty::Generator(..) |
|
||||
ty::GeneratorWitness(..) |
|
||||
|
@ -269,7 +269,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
ty::Generator(..) => Some(18),
|
||||
ty::Foreign(..) => Some(19),
|
||||
ty::GeneratorWitness(..) => Some(20),
|
||||
ty::Infer(..) | ty::Error => None
|
||||
ty::Infer(..) | ty::Error => None,
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -253,5 +253,7 @@ pub fn trivial_dropck_outlives<'tcx>(tcx: TyCtxt<'_, '_, 'tcx>, ty: Ty<'tcx>) ->
|
||||
| ty::Opaque(..)
|
||||
| ty::Infer(_)
|
||||
| ty::Generator(..) => false,
|
||||
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
}
|
||||
}
|
||||
|
@ -2283,6 +2283,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
ty::Projection(_) | ty::Param(_) | ty::Opaque(..) => None,
|
||||
ty::Infer(ty::TyVar(_)) => Ambiguous,
|
||||
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Infer(ty::CanonicalTy(_)) |
|
||||
ty::Infer(ty::FreshTy(_)) |
|
||||
ty::Infer(ty::FreshIntTy(_)) |
|
||||
@ -2355,6 +2356,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
Ambiguous
|
||||
}
|
||||
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Infer(ty::CanonicalTy(_)) |
|
||||
ty::Infer(ty::FreshTy(_)) |
|
||||
ty::Infer(ty::FreshIntTy(_)) |
|
||||
@ -2393,6 +2395,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Dynamic(..) |
|
||||
ty::Param(..) |
|
||||
ty::Foreign(..) |
|
||||
|
@ -2234,7 +2234,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
|
||||
self,
|
||||
Adt, Array, Slice, RawPtr, Ref, FnDef, FnPtr,
|
||||
Generator, GeneratorWitness, Dynamic, Closure, Tuple,
|
||||
Param, Infer, Projection, Opaque, Foreign);
|
||||
Param, Infer, UnnormalizedProjection, Projection, Opaque, Foreign);
|
||||
|
||||
println!("Substs interner: #{}", self.interners.substs.borrow().len());
|
||||
println!("Region interner: #{}", self.interners.region.borrow().len());
|
||||
|
@ -222,6 +222,7 @@ impl<'a, 'gcx, 'lcx, 'tcx> ty::TyS<'tcx> {
|
||||
ty::Infer(ty::FreshIntTy(_)) => "skolemized integral type".to_string(),
|
||||
ty::Infer(ty::FreshFloatTy(_)) => "skolemized floating-point type".to_string(),
|
||||
ty::Projection(_) => "associated type".to_string(),
|
||||
ty::UnnormalizedProjection(_) => "non-normalized associated type".to_string(),
|
||||
ty::Param(ref p) => {
|
||||
if p.is_self() {
|
||||
"Self".to_string()
|
||||
|
@ -103,6 +103,7 @@ pub fn simplify_type<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
ty::FnPtr(ref f) => {
|
||||
Some(FunctionSimplifiedType(f.skip_binder().inputs().len()))
|
||||
}
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
ty::Projection(_) | ty::Param(_) => {
|
||||
if can_simplify_params {
|
||||
// In normalized types, projections don't unify with
|
||||
|
@ -150,6 +150,8 @@ impl FlagComputation {
|
||||
self.add_projection_ty(data);
|
||||
}
|
||||
|
||||
&ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
|
||||
&ty::Opaque(_, substs) => {
|
||||
self.add_flags(TypeFlags::HAS_PROJECTION);
|
||||
self.add_substs(substs);
|
||||
|
@ -463,6 +463,7 @@ pub fn characteristic_def_id_of_type(ty: Ty<'_>) -> Option<DefId> {
|
||||
ty::Str |
|
||||
ty::FnPtr(_) |
|
||||
ty::Projection(_) |
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Param(_) |
|
||||
ty::Opaque(..) |
|
||||
ty::Infer(_) |
|
||||
|
@ -1123,7 +1123,7 @@ impl<'a, 'tcx> LayoutCx<'tcx, TyCtxt<'a, 'tcx, 'tcx>> {
|
||||
}
|
||||
tcx.layout_raw(param_env.and(normalized))?
|
||||
}
|
||||
ty::GeneratorWitness(..) | ty::Infer(_) => {
|
||||
ty::UnnormalizedProjection(..) | ty::GeneratorWitness(..) | ty::Infer(_) => {
|
||||
bug!("LayoutDetails::compute: unexpected type `{}`", ty)
|
||||
}
|
||||
ty::Param(_) | ty::Error => {
|
||||
@ -1702,8 +1702,8 @@ impl<'a, 'tcx, C> TyLayoutMethods<'tcx, C> for Ty<'tcx>
|
||||
}
|
||||
}
|
||||
|
||||
ty::Projection(_) | ty::Opaque(..) | ty::Param(_) |
|
||||
ty::Infer(_) | ty::Error => {
|
||||
ty::Projection(_) | ty::UnnormalizedProjection(..) |
|
||||
ty::Opaque(..) | ty::Param(_) | ty::Infer(_) | ty::Error => {
|
||||
bug!("TyLayout::field_type: unexpected type `{}`", this.ty)
|
||||
}
|
||||
})
|
||||
|
@ -2340,6 +2340,8 @@ impl<'a, 'gcx, 'tcx> AdtDef {
|
||||
vec![ty]
|
||||
}
|
||||
|
||||
UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
|
||||
Param(..) => {
|
||||
// perf hack: if there is a `T: Sized` bound, then
|
||||
// we know that `T` is Sized and do not need to check
|
||||
|
@ -124,6 +124,8 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
|
||||
// We assume that inference variables are fully resolved.
|
||||
// So, if we encounter an inference variable, just record
|
||||
// the unresolved variable as a component.
|
||||
|
@ -876,6 +876,9 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> {
|
||||
ty::GeneratorWitness(types) => ty::GeneratorWitness(types.fold_with(folder)),
|
||||
ty::Closure(did, substs) => ty::Closure(did, substs.fold_with(folder)),
|
||||
ty::Projection(ref data) => ty::Projection(data.fold_with(folder)),
|
||||
ty::UnnormalizedProjection(ref data) => {
|
||||
ty::UnnormalizedProjection(data.fold_with(folder))
|
||||
}
|
||||
ty::Opaque(did, substs) => ty::Opaque(did, substs.fold_with(folder)),
|
||||
ty::Bool | ty::Char | ty::Str | ty::Int(_) |
|
||||
ty::Uint(_) | ty::Float(_) | ty::Error | ty::Infer(_) |
|
||||
@ -910,7 +913,9 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> {
|
||||
}
|
||||
ty::GeneratorWitness(ref types) => types.visit_with(visitor),
|
||||
ty::Closure(_did, ref substs) => substs.visit_with(visitor),
|
||||
ty::Projection(ref data) => data.visit_with(visitor),
|
||||
ty::Projection(ref data) | ty::UnnormalizedProjection(ref data) => {
|
||||
data.visit_with(visitor)
|
||||
}
|
||||
ty::Opaque(_, ref substs) => substs.visit_with(visitor),
|
||||
ty::Bool | ty::Char | ty::Str | ty::Int(_) |
|
||||
ty::Uint(_) | ty::Float(_) | ty::Error | ty::Infer(_) |
|
||||
|
@ -157,6 +157,11 @@ pub enum TyKind<'tcx> {
|
||||
/// `<T as Trait<..>>::N`.
|
||||
Projection(ProjectionTy<'tcx>),
|
||||
|
||||
/// A placeholder type used when we do not have enough information
|
||||
/// to normalize the projection of an associated type to an
|
||||
/// existing concrete type. Currently only used with chalk-engine.
|
||||
UnnormalizedProjection(ProjectionTy<'tcx>),
|
||||
|
||||
/// Opaque (`impl Trait`) type found in a return type.
|
||||
/// The `DefId` comes either from
|
||||
/// * the `impl Trait` ast::Ty node,
|
||||
@ -1806,7 +1811,7 @@ impl<'a, 'gcx, 'tcx> TyS<'tcx> {
|
||||
Generator(_, GeneratorSubsts { ref substs }, _) => {
|
||||
substs.regions().collect()
|
||||
}
|
||||
Projection(ref data) => {
|
||||
Projection(ref data) | UnnormalizedProjection(ref data) => {
|
||||
data.substs.regions().collect()
|
||||
}
|
||||
FnDef(..) |
|
||||
@ -1886,6 +1891,8 @@ impl<'a, 'gcx, 'tcx> TyS<'tcx> {
|
||||
|
||||
ty::Projection(_) | ty::Param(_) | ty::Opaque(..) => false,
|
||||
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
|
||||
ty::Infer(ty::TyVar(_)) => false,
|
||||
|
||||
ty::Infer(ty::CanonicalTy(_)) |
|
||||
|
@ -958,6 +958,8 @@ fn needs_drop_raw<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
ty::Dynamic(..) | ty::Projection(..) | ty::Param(_) |
|
||||
ty::Opaque(..) | ty::Infer(_) | ty::Error => true,
|
||||
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
|
||||
// Structural recursion.
|
||||
ty::Array(ty, _) | ty::Slice(ty) => needs_drop(ty),
|
||||
|
||||
|
@ -97,7 +97,7 @@ fn push_subtypes<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent_ty: Ty<'tcx>) {
|
||||
ty::Ref(_, ty, _) => {
|
||||
stack.push(ty);
|
||||
}
|
||||
ty::Projection(ref data) => {
|
||||
ty::Projection(ref data) | ty::UnnormalizedProjection(ref data) => {
|
||||
stack.extend(data.substs.types().rev());
|
||||
}
|
||||
ty::Dynamic(ref obj, ..) => {
|
||||
|
@ -289,6 +289,8 @@ impl<'a, 'gcx, 'tcx> WfPredicates<'a, 'gcx, 'tcx> {
|
||||
self.compute_projection(data);
|
||||
}
|
||||
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
|
||||
ty::Adt(def, substs) => {
|
||||
// WfNominalType
|
||||
let obligations = self.nominal_obligations(def.did, substs);
|
||||
|
@ -18,7 +18,7 @@ use ty::{Bool, Char, Adt};
|
||||
use ty::{Error, Str, Array, Slice, Float, FnDef, FnPtr};
|
||||
use ty::{Param, RawPtr, Ref, Never, Tuple};
|
||||
use ty::{Closure, Generator, GeneratorWitness, Foreign, Projection, Opaque};
|
||||
use ty::{Dynamic, Int, Uint, Infer};
|
||||
use ty::{UnnormalizedProjection, Dynamic, Int, Uint, Infer};
|
||||
use ty::{self, RegionVid, Ty, TyCtxt, TypeFoldable, GenericParamCount, GenericParamDefKind};
|
||||
use util::nodemap::FxHashSet;
|
||||
|
||||
@ -1143,6 +1143,11 @@ define_print! {
|
||||
}
|
||||
Foreign(def_id) => parameterized(f, subst::Substs::empty(), def_id, &[]),
|
||||
Projection(ref data) => data.print(f, cx),
|
||||
UnnormalizedProjection(ref data) => {
|
||||
write!(f, "Unnormalized(")?;
|
||||
data.print(f, cx)?;
|
||||
write!(f, ")")
|
||||
}
|
||||
Opaque(def_id, substs) => {
|
||||
if cx.is_verbose {
|
||||
return write!(f, "Opaque({:?}, {:?})", def_id, substs);
|
||||
|
@ -173,6 +173,7 @@ pub fn push_debuginfo_type_name<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
|
||||
}
|
||||
ty::Error |
|
||||
ty::Infer(_) |
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Projection(..) |
|
||||
ty::Opaque(..) |
|
||||
ty::GeneratorWitness(..) |
|
||||
|
@ -722,6 +722,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||
ty::Closure(..) |
|
||||
ty::Generator(..) |
|
||||
ty::GeneratorWitness(..) |
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Projection(..) |
|
||||
ty::Opaque(..) |
|
||||
ty::FnDef(..) => bug!("Unexpected type in foreign function"),
|
||||
|
@ -382,6 +382,7 @@ impl<'a, 'tcx> DefPathBasedNames<'a, 'tcx> {
|
||||
}
|
||||
ty::Error |
|
||||
ty::Infer(_) |
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::Projection(..) |
|
||||
ty::Param(_) |
|
||||
ty::GeneratorWitness(_) |
|
||||
|
@ -272,6 +272,8 @@ fn dtorck_constraint_for_ty<'a, 'gcx, 'tcx>(
|
||||
overflows: vec![],
|
||||
}),
|
||||
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
|
||||
ty::Infer(..) | ty::Error => {
|
||||
// By the time this code runs, all type variables ought to
|
||||
// be fully resolved.
|
||||
|
@ -124,6 +124,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
ty::Foreign(..) => Some(PointerKind::Thin),
|
||||
// We should really try to normalize here.
|
||||
ty::Projection(ref pi) => Some(PointerKind::OfProjection(pi)),
|
||||
ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"),
|
||||
ty::Opaque(def_id, substs) => Some(PointerKind::OfOpaque(def_id, substs)),
|
||||
ty::Param(ref p) => Some(PointerKind::OfParam(p)),
|
||||
// Insufficient type information.
|
||||
|
@ -336,6 +336,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
|
||||
// types, where we use Error as the Self type
|
||||
}
|
||||
|
||||
ty::UnnormalizedProjection(..) |
|
||||
ty::GeneratorWitness(..) |
|
||||
ty::Infer(..) => {
|
||||
bug!("unexpected type encountered in \
|
||||
|
@ -2737,6 +2737,7 @@ impl<'tcx> Clean<Type> for Ty<'tcx> {
|
||||
|
||||
ty::Closure(..) | ty::Generator(..) => Tuple(vec![]), // FIXME(pcwalton)
|
||||
|
||||
ty::UnnormalizedProjection(..) => panic!("UnnormalizedProjection"),
|
||||
ty::GeneratorWitness(..) => panic!("GeneratorWitness"),
|
||||
ty::Infer(..) => panic!("Infer"),
|
||||
ty::Error => panic!("Error"),
|
||||
|
Loading…
Reference in New Issue
Block a user