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