diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index d485b9b32d431..4524c486272b5 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -1621,20 +1621,19 @@ 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 + 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), 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 () {}