Plumb dyn trait representation through ty::Dynamic
This commit is contained in:
parent
eff35e59c6
commit
6c01273a15
29 changed files with 110 additions and 57 deletions
|
@ -63,7 +63,9 @@ use rustc_span::{Span, DUMMY_SP};
|
|||
use rustc_target::abi::{Layout, LayoutS, TargetDataLayout, VariantIdx};
|
||||
use rustc_target::spec::abi;
|
||||
use rustc_type_ir::sty::TyKind::*;
|
||||
use rustc_type_ir::{InternAs, InternIteratorElement, Interner, TypeFlags};
|
||||
use rustc_type_ir::{
|
||||
InternAs, InternIteratorElement, Interner, TraitObjectRepresentation, TypeFlags,
|
||||
};
|
||||
|
||||
use std::any::Any;
|
||||
use std::borrow::Borrow;
|
||||
|
@ -2545,8 +2547,9 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
self,
|
||||
obj: &'tcx List<ty::Binder<'tcx, ExistentialPredicate<'tcx>>>,
|
||||
reg: ty::Region<'tcx>,
|
||||
repr: TraitObjectRepresentation,
|
||||
) -> Ty<'tcx> {
|
||||
self.mk_ty(Dynamic(obj, reg))
|
||||
self.mk_ty(Dynamic(obj, reg, repr))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
@ -467,7 +467,7 @@ impl<'tcx> TypeVisitor<'tcx> for IsSuggestableVisitor<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
Dynamic(dty, _) => {
|
||||
Dynamic(dty, _, _) => {
|
||||
for pred in *dty {
|
||||
match pred.skip_binder() {
|
||||
ExistentialPredicate::Trait(_) | ExistentialPredicate::Projection(_) => {
|
||||
|
|
|
@ -171,7 +171,7 @@ impl FlagComputation {
|
|||
self.add_substs(substs);
|
||||
}
|
||||
|
||||
&ty::Dynamic(obj, r) => {
|
||||
&ty::Dynamic(obj, r, _) => {
|
||||
for predicate in obj.iter() {
|
||||
self.bound_computation(predicate, |computation, predicate| match predicate {
|
||||
ty::ExistentialPredicate::Trait(tr) => computation.add_substs(tr.substs),
|
||||
|
|
|
@ -2464,7 +2464,8 @@ where
|
|||
|
||||
match tcx.struct_tail_erasing_lifetimes(pointee, cx.param_env()).kind() {
|
||||
ty::Slice(_) | ty::Str => TyMaybeWithLayout::Ty(tcx.types.usize),
|
||||
ty::Dynamic(_, _) => {
|
||||
// FIXME(eholk): Do the right thing with trait object representation
|
||||
ty::Dynamic(_, _, _repr) => {
|
||||
TyMaybeWithLayout::Ty(tcx.mk_imm_ref(
|
||||
tcx.lifetimes.re_static,
|
||||
tcx.mk_array(tcx.types.usize, 3),
|
||||
|
|
|
@ -16,6 +16,7 @@ use rustc_session::cstore::{ExternCrate, ExternCrateSource};
|
|||
use rustc_span::symbol::{kw, Ident, Symbol};
|
||||
use rustc_target::abi::Size;
|
||||
use rustc_target::spec::abi::Abi;
|
||||
use rustc_type_ir::TraitObjectRepresentation;
|
||||
|
||||
use std::cell::Cell;
|
||||
use std::char;
|
||||
|
@ -619,12 +620,16 @@ pub trait PrettyPrinter<'tcx>:
|
|||
ty::Adt(def, substs) => {
|
||||
p!(print_def_path(def.did(), substs));
|
||||
}
|
||||
ty::Dynamic(data, r) => {
|
||||
ty::Dynamic(data, r, repr) => {
|
||||
let print_r = self.should_print_region(r);
|
||||
if print_r {
|
||||
p!("(");
|
||||
}
|
||||
p!("dyn ", print(data));
|
||||
match repr {
|
||||
TraitObjectRepresentation::Unsized => p!("dyn "),
|
||||
TraitObjectRepresentation::Sized => p!("dyn* "),
|
||||
}
|
||||
p!(print(data));
|
||||
if print_r {
|
||||
p!(" + ", print(r), ")");
|
||||
}
|
||||
|
|
|
@ -441,7 +441,9 @@ pub fn super_relate_tys<'tcx, R: TypeRelation<'tcx>>(
|
|||
|
||||
(&ty::Foreign(a_id), &ty::Foreign(b_id)) if a_id == b_id => Ok(tcx.mk_foreign(a_id)),
|
||||
|
||||
(&ty::Dynamic(a_obj, a_region), &ty::Dynamic(b_obj, b_region)) => {
|
||||
(&ty::Dynamic(a_obj, a_region, a_repr), &ty::Dynamic(b_obj, b_region, b_repr))
|
||||
if a_repr == b_repr =>
|
||||
{
|
||||
let region_bound = relation.with_cause(Cause::ExistentialRegionBound, |relation| {
|
||||
relation.relate_with_variance(
|
||||
ty::Contravariant,
|
||||
|
@ -450,7 +452,7 @@ pub fn super_relate_tys<'tcx, R: TypeRelation<'tcx>>(
|
|||
b_region,
|
||||
)
|
||||
})?;
|
||||
Ok(tcx.mk_dynamic(relation.relate(a_obj, b_obj)?, region_bound))
|
||||
Ok(tcx.mk_dynamic(relation.relate(a_obj, b_obj)?, region_bound, a_repr))
|
||||
}
|
||||
|
||||
(&ty::Generator(a_id, a_substs, movability), &ty::Generator(b_id, b_substs, _))
|
||||
|
|
|
@ -1014,9 +1014,11 @@ impl<'tcx> TypeSuperFoldable<'tcx> for Ty<'tcx> {
|
|||
ty::Array(typ, sz) => ty::Array(typ.try_fold_with(folder)?, sz.try_fold_with(folder)?),
|
||||
ty::Slice(typ) => ty::Slice(typ.try_fold_with(folder)?),
|
||||
ty::Adt(tid, substs) => ty::Adt(tid, substs.try_fold_with(folder)?),
|
||||
ty::Dynamic(trait_ty, region) => {
|
||||
ty::Dynamic(trait_ty.try_fold_with(folder)?, region.try_fold_with(folder)?)
|
||||
}
|
||||
ty::Dynamic(trait_ty, region, representation) => ty::Dynamic(
|
||||
trait_ty.try_fold_with(folder)?,
|
||||
region.try_fold_with(folder)?,
|
||||
representation,
|
||||
),
|
||||
ty::Tuple(ts) => ty::Tuple(ts.try_fold_with(folder)?),
|
||||
ty::FnDef(def_id, substs) => ty::FnDef(def_id, substs.try_fold_with(folder)?),
|
||||
ty::FnPtr(f) => ty::FnPtr(f.try_fold_with(folder)?),
|
||||
|
@ -1060,7 +1062,7 @@ impl<'tcx> TypeSuperVisitable<'tcx> for Ty<'tcx> {
|
|||
}
|
||||
ty::Slice(typ) => typ.visit_with(visitor),
|
||||
ty::Adt(_, substs) => substs.visit_with(visitor),
|
||||
ty::Dynamic(ref trait_ty, ref reg) => {
|
||||
ty::Dynamic(ref trait_ty, ref reg, _) => {
|
||||
trait_ty.visit_with(visitor)?;
|
||||
reg.visit_with(visitor)
|
||||
}
|
||||
|
|
|
@ -152,7 +152,7 @@ fn push_inner<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent: GenericArg<'tcx>)
|
|||
ty::Projection(data) => {
|
||||
stack.extend(data.substs.iter().rev());
|
||||
}
|
||||
ty::Dynamic(obj, lt) => {
|
||||
ty::Dynamic(obj, lt, _) => {
|
||||
stack.push(lt.into());
|
||||
stack.extend(obj.iter().rev().flat_map(|predicate| {
|
||||
let (substs, opt_ty) = match predicate.skip_binder() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue