diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-09-18 12:11:43 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-09-18 12:11:43 +0000 |
commit | 20104048be328324112cc40c4b9df8145182e375 (patch) | |
tree | d394bf14cf845768c24fa6952ef90a5d9afbd826 /clang/test/CodeGenCXX/union-dtor.cpp | |
parent | 12d5ed8850aa3321ff0ecfd6d41d2c71db2efef5 (diff) | |
download | bcm5719-llvm-20104048be328324112cc40c4b9df8145182e375.tar.gz bcm5719-llvm-20104048be328324112cc40c4b9df8145182e375.zip |
PR10304: Do not call destructors for data members from union destructors. Prior to C++11, this
has no effect since any such destructors must be trivial, and in C++11 such destructors must not
be called.
llvm-svn: 139997
Diffstat (limited to 'clang/test/CodeGenCXX/union-dtor.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/union-dtor.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/union-dtor.cpp b/clang/test/CodeGenCXX/union-dtor.cpp new file mode 100644 index 00000000000..a9d1f8e9bd7 --- /dev/null +++ b/clang/test/CodeGenCXX/union-dtor.cpp @@ -0,0 +1,42 @@ +// RUN: %clang_cc1 -std=c++0x %s -S -o - -emit-llvm | FileCheck %s + +// PR10304: destructors should not call destructors for variant members. + +template<bool b = false> +struct Foo { + Foo() { static_assert(b, "Foo::Foo used"); } + ~Foo() { static_assert(b, "Foo::~Foo used"); } +}; + +struct Bar { + Bar(); + ~Bar(); +}; + +union FooBar { + FooBar() {} + ~FooBar() {} + Foo<> foo; + Bar bar; +}; + +struct Variant { + Variant() {} + ~Variant() {} + union { + Foo<> foo; + Bar bar; + }; +}; + +FooBar foobar; +Variant variant; + +// The ctor and dtor of Foo<> and Bar should not be mentioned in the resulting +// code. +// +// CHECK-NOT: 3FooILb1EEC1 +// CHECK-NOT: 3BarC1 +// +// CHECK-NOT: 3FooILb1EED1 +// CHECK-NOT: 3BarD1 |