1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 %s -S -o - -emit-llvm | FileCheck %s
2416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith
3416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith// PR10304: destructors should not call destructors for variant members.
4416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith
5416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smithtemplate<bool b = false>
6416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smithstruct Foo {
7416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  Foo() { static_assert(b, "Foo::Foo used"); }
8416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  ~Foo() { static_assert(b, "Foo::~Foo used"); }
9416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith};
10416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith
11416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smithstruct Bar {
12416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  Bar();
13416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  ~Bar();
14416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith};
15416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith
16416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smithunion FooBar {
17416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  FooBar() {}
18416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  ~FooBar() {}
19416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  Foo<> foo;
20416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  Bar bar;
21416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith};
22416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith
23416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smithstruct Variant {
24416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  Variant() {}
25416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  ~Variant() {}
26416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  union {
27416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith    Foo<> foo;
28416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith    Bar bar;
29416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith  };
30416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith};
31416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith
32416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard SmithFooBar foobar;
33416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard SmithVariant variant;
34416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith
35416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith// The ctor and dtor of Foo<> and Bar should not be mentioned in the resulting
36416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith// code.
37416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith//
38416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith// CHECK-NOT: 3FooILb1EEC1
39416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith// CHECK-NOT: 3BarC1
40416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith//
41416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith// CHECK-NOT: 3FooILb1EED1
42416f63e42d4c34a38833a3aa8fa1ebb3c847722bRichard Smith// CHECK-NOT: 3BarD1
43