mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-26 13:01:27 +03:00
46f360abbd
Dead code elimination used to fail when a Drop impl contained a panic and a potentially-panicking external function was called after the value was created. This was fixed since 1.82 but no regression test was added. The test verifies that foo() compiles to just a call to unknown() and ret void, with no panic or panicking call in the function body. Signed-off-by: Naveen R. Iyer <iyernaveenr@gmail.com>
35 lines
673 B
Rust
35 lines
673 B
Rust
//@ compile-flags: -Copt-level=3
|
|
#![crate_type = "lib"]
|
|
|
|
// Regression test for #114532.
|
|
// Dead code elimination used to fail when a Drop impl contained a panic
|
|
// and a potentially-panicking function was called after the value was created.
|
|
|
|
struct Foo(bool);
|
|
|
|
impl Drop for Foo {
|
|
fn drop(&mut self) {
|
|
if self.0 {
|
|
return;
|
|
}
|
|
panic!("dead");
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: @foo(
|
|
// CHECK-NOT: panic
|
|
// CHECK-NOT: call void @{{.*}}panicking
|
|
// CHECK: call {{.*}} @unknown(
|
|
// CHECK-NEXT: ret void
|
|
#[no_mangle]
|
|
pub fn foo() {
|
|
let _a = Foo(true);
|
|
unsafe {
|
|
unknown(9);
|
|
}
|
|
}
|
|
|
|
extern "Rust" {
|
|
fn unknown(x: i32) -> bool;
|
|
}
|