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