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_codegen_ssa | |
| 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_codegen_ssa')
| -rw-r--r-- | src/librustc_codegen_ssa/meth.rs | 13 | ||||
| -rw-r--r-- | src/librustc_codegen_ssa/traits/misc.rs | 2 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/librustc_codegen_ssa/meth.rs b/src/librustc_codegen_ssa/meth.rs index 31640826262..98ad2616eea 100644 --- a/src/librustc_codegen_ssa/meth.rs +++ b/src/librustc_codegen_ssa/meth.rs @@ -69,7 +69,7 @@ impl<'a, 'tcx: 'a> VirtualIndex { pub fn get_vtable<'tcx, Cx: CodegenMethods<'tcx>>( cx: &Cx, ty: Ty<'tcx>, - trait_ref: ty::PolyExistentialTraitRef<'tcx>, + trait_ref: Option<ty::PolyExistentialTraitRef<'tcx>>, ) -> Cx::Value { let tcx = cx.tcx(); @@ -83,8 +83,15 @@ pub fn get_vtable<'tcx, Cx: CodegenMethods<'tcx>>( // Not in the cache. Build it. let nullptr = cx.const_null(cx.type_i8p()); - let methods = tcx.vtable_methods(trait_ref.with_self_ty(tcx, ty)); - let methods = methods.iter().cloned().map(|opt_mth| { + let methods_root; + let methods = if let Some(trait_ref) = trait_ref { + methods_root = tcx.vtable_methods(trait_ref.with_self_ty(tcx, ty)); + methods_root.iter() + } else { + (&[]).iter() + }; + + let methods = methods.cloned().map(|opt_mth| { opt_mth.map_or(nullptr, |(def_id, substs)| { callee::resolve_and_get_fn_for_vtable(cx, def_id, substs) }) diff --git a/src/librustc_codegen_ssa/traits/misc.rs b/src/librustc_codegen_ssa/traits/misc.rs index c297288b255..b2315556366 100644 --- a/src/librustc_codegen_ssa/traits/misc.rs +++ b/src/librustc_codegen_ssa/traits/misc.rs @@ -11,7 +11,7 @@ use std::sync::Arc; pub trait MiscMethods<'tcx>: BackendTypes { fn vtables( &self, - ) -> &RefCell<FxHashMap<(Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>), Self::Value>>; + ) -> &RefCell<FxHashMap<(Ty<'tcx>, Option<ty::PolyExistentialTraitRef<'tcx>>), Self::Value>>; fn check_overflow(&self) -> bool; fn instances(&self) -> &RefCell<FxHashMap<Instance<'tcx>, Self::Value>>; fn get_fn(&self, instance: Instance<'tcx>) -> Self::Value; |
