From 0ed8e16195658b839f6ff8f7b8ae719a42d2827e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Sun, 26 Aug 2018 22:21:20 +0200 Subject: [PATCH 1/2] Use partial but correct vtable layout --- src/librustc/ty/layout.rs | 12 ++--------- src/test/codegen/function-arguments.rs | 4 ++-- src/test/ui/consts/const-eval/issue-53401.rs | 21 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 src/test/ui/consts/const-eval/issue-53401.rs diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index d485b9b32d431..c93ca836bef00 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -1621,18 +1621,10 @@ impl<'a, 'tcx, C> TyLayoutMethods<'tcx, C> for Ty<'tcx> match tcx.struct_tail(pointee).sty { ty::Slice(_) | ty::Str => tcx.types.usize, - ty::Dynamic(data, _) => { - let trait_def_id = data.principal().unwrap().def_id(); - let num_fns: u64 = crate::traits::supertrait_def_ids(tcx, trait_def_id) - .map(|trait_def_id| { - tcx.associated_items(trait_def_id) - .filter(|item| item.kind == ty::AssociatedKind::Method) - .count() as u64 - }) - .sum(); + ty::Dynamic(_, _) => { tcx.mk_imm_ref( tcx.types.re_static, - tcx.mk_array(tcx.types.usize, 3 + num_fns), + tcx.mk_array(tcx.types.usize, 3), ) /* FIXME use actual fn pointers tcx.mk_tup(&[ diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs index 09031508da1f7..0bd021f8ae2d6 100644 --- a/src/test/codegen/function-arguments.rs +++ b/src/test/codegen/function-arguments.rs @@ -120,13 +120,13 @@ pub fn unsafe_slice(_: &[UnsafeInner]) { pub fn str(_: &[u8]) { } -// CHECK: @trait_borrow({}* nonnull %arg0.0, [4 x [[USIZE]]]* noalias readonly dereferenceable({{.*}}) %arg0.1) +// CHECK: @trait_borrow({}* nonnull %arg0.0, [3 x [[USIZE]]]* noalias readonly dereferenceable({{.*}}) %arg0.1) // FIXME #25759 This should also have `nocapture` #[no_mangle] pub fn trait_borrow(_: &Drop) { } -// CHECK: @trait_box({}* noalias nonnull, [4 x [[USIZE]]]* noalias readonly dereferenceable({{.*}})) +// CHECK: @trait_box({}* noalias nonnull, [3 x [[USIZE]]]* noalias readonly dereferenceable({{.*}})) #[no_mangle] pub fn trait_box(_: Box) { } diff --git a/src/test/ui/consts/const-eval/issue-53401.rs b/src/test/ui/consts/const-eval/issue-53401.rs new file mode 100644 index 0000000000000..cb74f4f8f75f3 --- /dev/null +++ b/src/test/ui/consts/const-eval/issue-53401.rs @@ -0,0 +1,21 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-pass + +pub const STATIC_TRAIT: &Test = &(); + +fn main() {} + +pub trait Test { + fn test() where Self: Sized {} +} + +impl Test for () {} From f318ba2d2fb542e0b1df9be38671dc64e3c07ab5 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 28 Aug 2018 14:04:07 +0200 Subject: [PATCH 2/2] Warn about naively fixing the FIXME --- src/librustc/ty/layout.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index c93ca836bef00..4524c486272b5 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -1627,6 +1627,13 @@ impl<'a, 'tcx, C> TyLayoutMethods<'tcx, C> for Ty<'tcx> tcx.mk_array(tcx.types.usize, 3), ) /* FIXME use actual fn pointers + Warning: naively computing the number of entries in the + vtable by counting the methods on the trait + methods on + all parent traits does not work, because some methods can + be not object safe and thus excluded from the vtable. + Increase this counter if you tried to implement this but + failed to do it without duplicating a lot of code from + other places in the compiler: 2 tcx.mk_tup(&[ tcx.mk_array(tcx.types.usize, 3), tcx.mk_array(Option),