llvm-project/clang/test/CodeGenCXX/attr-no-destroy-d54344.cpp
Richard Smith 2b4fa5348e For P0784R7: compute whether a variable has constant destruction if it
has a constexpr destructor.

For constexpr variables, reject if the variable does not have constant
destruction. In all cases, do not emit runtime calls to the destructor
for variables with constant destruction.

llvm-svn: 373159
2019-09-29 05:08:46 +00:00

44 lines
1.6 KiB
C++

// RUN: %clang_cc1 -std=c++2a -emit-llvm -O0 -triple x86_64-unknown-linux-gnu -DNOATTR %s -o - | FileCheck %s
// RUN: %clang_cc1 -std=c++2a -emit-llvm -O0 -triple x86_64-unknown-linux-gnu %s -o - | FileCheck %s --check-prefix=CHECK-ATTR
// RUN: %clang_cc1 -std=c++2a -emit-llvm -O0 -triple x86_64-unknown-linux-gnu -DNOATTR -fno-c++-static-destructors %s -o - | FileCheck %s --check-prefix=CHECK-FLAG
// Regression test for D54344. Class with no user-defined destructor
// that has an inherited member that has a non-trivial destructor
// and a non-default constructor will attempt to emit a destructor
// despite being marked as __attribute((no_destroy)) in which case
// it would trigger an assertion due to an incorrect assumption.
// This test is more reliable with asserts to work as without
// the crash may (unlikely) could generate working but semantically
// incorrect code.
class a {
public:
a();
~a();
};
class logger_base {
a d;
};
class e : logger_base {};
#ifndef NOATTR
__attribute((no_destroy))
#endif
e g;
// In the absence of the attribute and flag, both ctor and dtor should
// be emitted, check for that.
// CHECK: @__cxx_global_var_init
// CHECK: @__cxa_atexit
// When attribute is enabled, the constructor should not be balanced
// by a destructor. Make sure we have the ctor but not the dtor
// registration.
// CHECK-ATTR: @__cxx_global_var_init
// CHECK-ATTR-NOT: @__cxa_atexit
// Same scenario except with global flag (-fno-c++-static-destructors)
// supressing it instead of the attribute.
// CHECK-FLAG: @__cxx_global_var_init
// CHECK-FLAG-NOT: @__cxa_atexit