diff options
| author | bors <bors@rust-lang.org> | 2019-01-05 03:36:31 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-01-05 03:36:31 +0000 |
| commit | 2fba17fc972f89fe9165fbed77d2f0ad6d3e2174 (patch) | |
| tree | 4d53cc7f637ccfb8c21ea5c1c113907d96694749 /src/librustc_mir/interpret | |
| parent | 244b05db12e47efef4695036974bc25fde13b828 (diff) | |
| parent | c213b0db2e8e344c419095450dbbdae71afa8c61 (diff) | |
| download | rust-2fba17fc972f89fe9165fbed77d2f0ad6d3e2174.tar.gz rust-2fba17fc972f89fe9165fbed77d2f0ad6d3e2174.zip | |
Auto merge of #56837 - arielb1:nonprincipal-trait-objects, r=nikomatsakis
Add support for trait-objects without a principal The hard-error version of #56481 - should be merged after we do something about the `traitobject` crate. Fixes #33140. Fixes #57057. r? @nikomatsakis
Diffstat (limited to 'src/librustc_mir/interpret')
| -rw-r--r-- | src/librustc_mir/interpret/eval_context.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/traits.rs | 13 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 9a76a36ef22..19362b6cfdb 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -42,7 +42,7 @@ pub struct EvalContext<'a, 'mir, 'tcx: 'a + 'mir, M: Machine<'a, 'mir, 'tcx>> { pub(crate) stack: Vec<Frame<'mir, 'tcx, M::PointerTag, M::FrameExtra>>, /// A cache for deduplicating vtables - pub(super) vtables: FxHashMap<(Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>), AllocId>, + pub(super) vtables: FxHashMap<(Ty<'tcx>, Option<ty::PolyExistentialTraitRef<'tcx>>), AllocId>, } /// A stack frame. diff --git a/src/librustc_mir/interpret/traits.rs b/src/librustc_mir/interpret/traits.rs index 69a52b002ce..642bbc114f5 100644 --- a/src/librustc_mir/interpret/traits.rs +++ b/src/librustc_mir/interpret/traits.rs @@ -1,3 +1,4 @@ +use rustc_data_structures::sync::Lrc; use rustc::ty::{self, Ty}; use rustc::ty::layout::{Size, Align, LayoutOf}; use rustc::mir::interpret::{Scalar, Pointer, EvalResult, PointerArithmetic}; @@ -14,7 +15,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> pub fn get_vtable( &mut self, ty: Ty<'tcx>, - poly_trait_ref: ty::PolyExistentialTraitRef<'tcx>, + poly_trait_ref: Option<ty::PolyExistentialTraitRef<'tcx>>, ) -> EvalResult<'tcx, Pointer<M::PointerTag>> { trace!("get_vtable(trait_ref={:?})", poly_trait_ref); @@ -24,10 +25,14 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> return Ok(Pointer::from(vtable).with_default_tag()); } - let trait_ref = poly_trait_ref.with_self_ty(*self.tcx, ty); - let trait_ref = self.tcx.erase_regions(&trait_ref); + let methods = if let Some(poly_trait_ref) = poly_trait_ref { + let trait_ref = poly_trait_ref.with_self_ty(*self.tcx, ty); + let trait_ref = self.tcx.erase_regions(&trait_ref); - let methods = self.tcx.vtable_methods(trait_ref); + self.tcx.vtable_methods(trait_ref) + } else { + Lrc::new(Vec::new()) + }; let layout = self.layout_of(ty)?; assert!(!layout.is_unsized(), "can't create a vtable for an unsized type"); |
