Fix tests to drop now-skipped codegen
This commit is contained in:
parent
1f40573507
commit
b4568d9135
4 changed files with 53 additions and 16 deletions
|
|
@ -24,7 +24,6 @@ impl<T> Trait for Struct<T> {
|
|||
pub fn start(_: isize, _: *const *const u8) -> isize {
|
||||
let s1 = Struct { _a: 0u32 };
|
||||
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<Struct<u32>> - shim(None) @@ instantiation_through_vtable-cgu.0[External]
|
||||
//~ MONO_ITEM fn <Struct<u32> as Trait>::foo
|
||||
//~ MONO_ITEM fn <Struct<u32> as Trait>::bar
|
||||
let r1 = &s1 as &Trait;
|
||||
|
|
@ -32,7 +31,6 @@ pub fn start(_: isize, _: *const *const u8) -> isize {
|
|||
r1.bar();
|
||||
|
||||
let s1 = Struct { _a: 0u64 };
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<Struct<u64>> - shim(None) @@ instantiation_through_vtable-cgu.0[External]
|
||||
//~ MONO_ITEM fn <Struct<u64> as Trait>::foo
|
||||
//~ MONO_ITEM fn <Struct<u64> as Trait>::bar
|
||||
let _ = &s1 as &Trait;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
//@ compile-flags:-Clink-dead-code -Zinline-mir=no
|
||||
//@ compile-flags:-Clink-dead-code -Zinline-mir=no -O
|
||||
|
||||
#![deny(dead_code)]
|
||||
#![crate_type = "lib"]
|
||||
|
|
@ -22,9 +22,8 @@ fn assigned_to_variable_but_not_executed() {
|
|||
//~ MONO_ITEM fn assigned_to_variable_executed_indirectly @@ non_generic_closures-cgu.0[External]
|
||||
fn assigned_to_variable_executed_indirectly() {
|
||||
//~ MONO_ITEM fn assigned_to_variable_executed_indirectly::{closure#0} @@ non_generic_closures-cgu.0[External]
|
||||
//~ MONO_ITEM fn <{closure@TEST_PATH:28:13: 28:21} as std::ops::FnOnce<(i32,)>>::call_once - shim @@ non_generic_closures-cgu.0[External]
|
||||
//~ MONO_ITEM fn <{closure@TEST_PATH:28:13: 28:21} as std::ops::FnOnce<(i32,)>>::call_once - shim(vtable) @@ non_generic_closures-cgu.0[External]
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<{closure@TEST_PATH:28:13: 28:21}> - shim(None) @@ non_generic_closures-cgu.0[External]
|
||||
//~ MONO_ITEM fn <{closure@TEST_PATH:27:13: 27:21} as std::ops::FnOnce<(i32,)>>::call_once - shim @@ non_generic_closures-cgu.0[External]
|
||||
//~ MONO_ITEM fn <{closure@TEST_PATH:27:13: 27:21} as std::ops::FnOnce<(i32,)>>::call_once - shim(vtable) @@ non_generic_closures-cgu.0[External]
|
||||
let f = |a: i32| {
|
||||
let _ = a + 2;
|
||||
};
|
||||
|
|
@ -40,6 +39,20 @@ fn assigned_to_variable_executed_directly() {
|
|||
f(4);
|
||||
}
|
||||
|
||||
// Make sure we generate mono items for stateful closures that need dropping
|
||||
//~ MONO_ITEM fn with_drop @@ non_generic_closures-cgu.0[External]
|
||||
fn with_drop(v: PresentDrop) {
|
||||
//~ MONO_ITEM fn with_drop::{closure#0} @@ non_generic_closures-cgu.0[External]
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<PresentDrop> - shim(Some(PresentDrop)) @@ non_generic_closures-cgu.0[Internal]
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<{closure@TEST_PATH:49:14: 49:24}> - shim(Some({closure@TEST_PATH:49:14: 49:24})) @@ non_generic_closures-cgu.0[Internal]
|
||||
|
||||
let _f = |a: usize| {
|
||||
let _ = a + 2;
|
||||
//~ MONO_ITEM fn std::mem::drop::<PresentDrop> @@ non_generic_closures-cgu.0[External]
|
||||
drop(v);
|
||||
};
|
||||
}
|
||||
|
||||
//~ MONO_ITEM fn start @@ non_generic_closures-cgu.0[External]
|
||||
#[no_mangle]
|
||||
pub fn start(_: isize, _: *const *const u8) -> isize {
|
||||
|
|
@ -47,6 +60,7 @@ pub fn start(_: isize, _: *const *const u8) -> isize {
|
|||
assigned_to_variable_but_not_executed();
|
||||
assigned_to_variable_executed_directly();
|
||||
assigned_to_variable_executed_indirectly();
|
||||
with_drop(PresentDrop);
|
||||
|
||||
0
|
||||
}
|
||||
|
|
@ -55,3 +69,10 @@ pub fn start(_: isize, _: *const *const u8) -> isize {
|
|||
fn run_closure(f: &Fn(i32)) {
|
||||
f(3);
|
||||
}
|
||||
|
||||
struct PresentDrop;
|
||||
|
||||
impl Drop for PresentDrop {
|
||||
//~ MONO_ITEM fn <PresentDrop as std::ops::Drop>::drop @@ non_generic_closures-cgu.0[External]
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
//@ compile-flags:-Zmir-opt-level=0
|
||||
//@ compile-flags:-Zmir-opt-level=0 -O
|
||||
|
||||
#![deny(dead_code)]
|
||||
#![feature(coerce_unsized)]
|
||||
|
|
@ -42,33 +42,47 @@ struct Wrapper<T: ?Sized>(#[allow(dead_code)] *const T);
|
|||
|
||||
impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Wrapper<U>> for Wrapper<T> {}
|
||||
|
||||
struct PresentDrop;
|
||||
|
||||
impl Drop for PresentDrop {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
// Custom Coercion Case
|
||||
impl Trait for PresentDrop {
|
||||
fn foo(&self) {}
|
||||
}
|
||||
|
||||
//~ MONO_ITEM fn start
|
||||
#[no_mangle]
|
||||
pub fn start(_: isize, _: *const *const u8) -> isize {
|
||||
// simple case
|
||||
let bool_sized = &true;
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<bool> - shim(None) @@ unsizing-cgu.0[Internal]
|
||||
//~ MONO_ITEM fn <bool as Trait>::foo
|
||||
let _bool_unsized = bool_sized as &Trait;
|
||||
|
||||
let char_sized = &'a';
|
||||
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<char> - shim(None) @@ unsizing-cgu.0[Internal]
|
||||
//~ MONO_ITEM fn <char as Trait>::foo
|
||||
let _char_unsized = char_sized as &Trait;
|
||||
|
||||
// struct field
|
||||
let struct_sized = &Struct { _a: 1, _b: 2, _c: 3.0f64 };
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<f64> - shim(None) @@ unsizing-cgu.0[Internal]
|
||||
//~ MONO_ITEM fn <f64 as Trait>::foo
|
||||
let _struct_unsized = struct_sized as &Struct<Trait>;
|
||||
|
||||
// custom coercion
|
||||
let wrapper_sized = Wrapper(&0u32);
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<u32> - shim(None) @@ unsizing-cgu.0[Internal]
|
||||
//~ MONO_ITEM fn <u32 as Trait>::foo
|
||||
let _wrapper_sized = wrapper_sized as Wrapper<Trait>;
|
||||
|
||||
// with drop
|
||||
let droppable = &PresentDrop;
|
||||
//~ MONO_ITEM fn <PresentDrop as std::ops::Drop>::drop @@ unsizing-cgu.0[Internal]
|
||||
//~ MONO_ITEM fn std::ptr::drop_in_place::<PresentDrop> - shim(Some(PresentDrop)) @@ unsizing-cgu.0[Internal]
|
||||
//~ MONO_ITEM fn <PresentDrop as Trait>::foo
|
||||
let droppable = droppable as &dyn Trait;
|
||||
|
||||
false.foo();
|
||||
|
||||
0
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
// Verifies that type metadata identifiers for drop functions are emitted correctly.
|
||||
//
|
||||
// Non needs_drop drop glue isn't codegen'd at all, so we don't try to check the IDs there. But we
|
||||
// do check it's not emitted which should help catch bugs if we do start generating it again in the
|
||||
// future.
|
||||
//
|
||||
//@ needs-sanitizer-cfi
|
||||
//@ compile-flags: -Clto -Cno-prepopulate-passes -Copt-level=0 -Zsanitizer=cfi -Ctarget-feature=-crt-static
|
||||
|
||||
|
|
@ -10,18 +14,18 @@
|
|||
// CHECK: call i1 @llvm.type.test(ptr {{%.+}}, metadata !"_ZTSFvPu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops4drop4Dropu6regionEE")
|
||||
|
||||
struct EmptyDrop;
|
||||
// CHECK: define{{.*}}4core3ptr{{[0-9]+}}drop_in_place$LT${{.*}}EmptyDrop$GT${{.*}}!type ![[TYPE1]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
|
||||
// CHECK-NOT: define{{.*}}4core3ptr{{[0-9]+}}drop_in_place$LT${{.*}}EmptyDrop$GT${{.*}}!type ![[TYPE1]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
|
||||
|
||||
struct NonEmptyDrop;
|
||||
struct PresentDrop;
|
||||
|
||||
impl Drop for NonEmptyDrop {
|
||||
impl Drop for PresentDrop {
|
||||
fn drop(&mut self) {}
|
||||
// CHECK: define{{.*}}4core3ptr{{[0-9]+}}drop_in_place$LT${{.*}}NonEmptyDrop$GT${{.*}}!type ![[TYPE1]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
|
||||
// CHECK: define{{.*}}4core3ptr{{[0-9]+}}drop_in_place$LT${{.*}}PresentDrop$GT${{.*}}!type ![[TYPE1]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
|
||||
}
|
||||
|
||||
pub fn foo() {
|
||||
let _ = Box::new(EmptyDrop) as Box<dyn Send>;
|
||||
let _ = Box::new(NonEmptyDrop) as Box<dyn Send>;
|
||||
let _ = Box::new(PresentDrop) as Box<dyn Send>;
|
||||
}
|
||||
|
||||
// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFvPu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops4drop4Dropu6regionEE"}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue