xref: /aosp_15_r20/external/clang/test/CodeGenCXX/union-dtor.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 %s -S -o - -emit-llvm | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // PR10304: destructors should not call destructors for variant members.
4*67e74705SXin Li 
5*67e74705SXin Li template<bool b = false>
6*67e74705SXin Li struct Foo {
FooFoo7*67e74705SXin Li   Foo() { static_assert(b, "Foo::Foo used"); }
~FooFoo8*67e74705SXin Li   ~Foo() { static_assert(b, "Foo::~Foo used"); }
9*67e74705SXin Li };
10*67e74705SXin Li 
11*67e74705SXin Li struct Bar {
12*67e74705SXin Li   Bar();
13*67e74705SXin Li   ~Bar();
14*67e74705SXin Li };
15*67e74705SXin Li 
16*67e74705SXin Li union FooBar {
FooBar()17*67e74705SXin Li   FooBar() {}
~FooBar()18*67e74705SXin Li   ~FooBar() {}
19*67e74705SXin Li   Foo<> foo;
20*67e74705SXin Li   Bar bar;
21*67e74705SXin Li };
22*67e74705SXin Li 
23*67e74705SXin Li struct Variant {
VariantVariant24*67e74705SXin Li   Variant() {}
~VariantVariant25*67e74705SXin Li   ~Variant() {}
26*67e74705SXin Li   union {
27*67e74705SXin Li     Foo<> foo;
28*67e74705SXin Li     Bar bar;
29*67e74705SXin Li   };
30*67e74705SXin Li };
31*67e74705SXin Li 
32*67e74705SXin Li FooBar foobar;
33*67e74705SXin Li Variant variant;
34*67e74705SXin Li 
35*67e74705SXin Li // The ctor and dtor of Foo<> and Bar should not be mentioned in the resulting
36*67e74705SXin Li // code.
37*67e74705SXin Li //
38*67e74705SXin Li // CHECK-NOT: 3FooILb1EEC1
39*67e74705SXin Li // CHECK-NOT: 3BarC1
40*67e74705SXin Li //
41*67e74705SXin Li // CHECK-NOT: 3FooILb1EED1
42*67e74705SXin Li // CHECK-NOT: 3BarD1
43