From 56417b373253932a19e811d001f63ef99f9d4d13 Mon Sep 17 00:00:00 2001 From: Eduard Burtescu Date: Tue, 8 Mar 2016 14:11:45 +0200 Subject: [PATCH] mir: Monomorphize LvalueTy's of projections. --- src/librustc/mir/tcx.rs | 24 ++++++++++++++++++++++++ src/librustc_trans/trans/mir/lvalue.rs | 1 + 2 files changed, 25 insertions(+) diff --git a/src/librustc/mir/tcx.rs b/src/librustc/mir/tcx.rs index b6b2694a7cb..d7848e60e4e 100644 --- a/src/librustc/mir/tcx.rs +++ b/src/librustc/mir/tcx.rs @@ -16,6 +16,7 @@ use mir::repr::*; use middle::subst::{Subst, Substs}; use middle::ty::{self, AdtDef, Ty, TyCtxt}; +use middle::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use rustc_front::hir; #[derive(Copy, Clone, Debug)] @@ -77,6 +78,29 @@ impl<'tcx> LvalueTy<'tcx> { } } +impl<'tcx> TypeFoldable<'tcx> for LvalueTy<'tcx> { + fn super_fold_with>(&self, folder: &mut F) -> Self { + match *self { + LvalueTy::Ty { ty } => LvalueTy::Ty { ty: ty.fold_with(folder) }, + LvalueTy::Downcast { adt_def, substs, variant_index } => { + let substs = substs.fold_with(folder); + LvalueTy::Downcast { + adt_def: adt_def, + substs: folder.tcx().mk_substs(substs), + variant_index: variant_index + } + } + } + } + + fn super_visit_with>(&self, visitor: &mut V) -> bool { + match *self { + LvalueTy::Ty { ty } => ty.visit_with(visitor), + LvalueTy::Downcast { substs, .. } => substs.visit_with(visitor) + } + } +} + impl<'tcx> Mir<'tcx> { pub fn operand_ty(&self, tcx: &TyCtxt<'tcx>, diff --git a/src/librustc_trans/trans/mir/lvalue.rs b/src/librustc_trans/trans/mir/lvalue.rs index 796a7c551f3..66cbe677bb3 100644 --- a/src/librustc_trans/trans/mir/lvalue.rs +++ b/src/librustc_trans/trans/mir/lvalue.rs @@ -114,6 +114,7 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> { mir::Lvalue::Projection(ref projection) => { let tr_base = self.trans_lvalue(bcx, &projection.base); let projected_ty = tr_base.ty.projection_ty(tcx, &projection.elem); + let projected_ty = bcx.monomorphize(&projected_ty); let (llprojected, llextra) = match projection.elem { mir::ProjectionElem::Deref => { let base_ty = tr_base.ty.to_ty(tcx);