mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 11:35:51 -04:00

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
59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s -std=c++2a | FileCheck %s --implicit-check-not=cxx_global_var_init --implicit-check-not=cxa_atexit
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-pch -o %t.pch %s -std=c++2a
|
|
// RUN: %clang_cc1 -triple x86_64-linux-gnu -include-pch %t.pch -x c++ /dev/null -emit-llvm -o - -std=c++2a | FileCheck %s --implicit-check-not=cxx_global_var_init --implicit-check-not=cxa_atexit
|
|
|
|
// CHECK: @a = global i32 123,
|
|
int a = (delete new int, 123);
|
|
|
|
struct B {
|
|
constexpr B() {}
|
|
constexpr ~B() { n *= 5; }
|
|
int n = 123;
|
|
};
|
|
// CHECK: @b = global {{.*}} i32 123
|
|
extern constexpr B b = B();
|
|
|
|
// CHECK: @_ZL1c = internal global {{.*}} i32 123
|
|
const B c;
|
|
int use_c() { return c.n; }
|
|
|
|
struct D {
|
|
int n;
|
|
constexpr ~D() {}
|
|
};
|
|
D d;
|
|
// CHECK: @d = global {{.*}} zeroinitializer
|
|
|
|
D d_arr[3];
|
|
// CHECK: @d_arr = global {{.*}} zeroinitializer
|
|
|
|
thread_local D d_tl;
|
|
// CHECK: @d_tl = thread_local global {{.*}} zeroinitializer
|
|
|
|
// CHECK-NOT: @llvm.global_ctors
|
|
|
|
// CHECK-LABEL: define {{.*}} @_Z1fv(
|
|
void f() {
|
|
// CHECK-NOT: call
|
|
// CHECK: call {{.*}}memcpy
|
|
// CHECK-NOT: call
|
|
// CHECK: call {{.*}}memset
|
|
// CHECK-NOT: call
|
|
// CHECK: }
|
|
constexpr B b;
|
|
D d = D();
|
|
}
|
|
|
|
// CHECK-LABEL: define {{.*}} @_Z1gv(
|
|
void g() {
|
|
// CHECK-NOT: call
|
|
// CHECK-NOT: cxa_guard
|
|
// CHECK-NOT: _ZGV
|
|
// CHECK: }
|
|
static constexpr B b1;
|
|
static const B b2;
|
|
static D d;
|
|
thread_local D d_tl;
|
|
}
|