[cfe-commits] r139997 - in /cfe/trunk: lib/CodeGen/CGClass.cpp lib/Sema/SemaDeclCXX.cpp test/CodeGenCXX/union-dtor.cpp

Douglas Gregor dgregor at apple.com
Mon Sep 19 07:43:33 PDT 2011


On Sep 18, 2011, at 5:11 AM, Richard Smith wrote:

> Author: rsmith
> Date: Sun Sep 18 07:11:43 2011
> New Revision: 139997
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=139997&view=rev
> Log:
> 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.

Do we also have to worry about anonymous unions in non-class scope?

	- Doug

> Added:
>    cfe/trunk/test/CodeGenCXX/union-dtor.cpp
> Modified:
>    cfe/trunk/lib/CodeGen/CGClass.cpp
>    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> 
> Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=139997&r1=139996&r2=139997&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGClass.cpp Sun Sep 18 07:11:43 2011
> @@ -980,6 +980,10 @@
> 
>   const CXXRecordDecl *ClassDecl = DD->getParent();
> 
> +  // Unions have no bases and do not call field destructors.
> +  if (ClassDecl->isUnion())
> +    return;
> +
>   // The complete-destructor phase just destructs all the virtual bases.
>   if (DtorType == Dtor_Complete) {
> 
> 
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=139997&r1=139996&r2=139997&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Sun Sep 18 07:11:43 2011
> @@ -2767,8 +2767,9 @@
> void
> Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location,
>                                              CXXRecordDecl *ClassDecl) {
> -  // Ignore dependent contexts.
> -  if (ClassDecl->isDependentContext())
> +  // Ignore dependent contexts. Also ignore unions, since their members never
> +  // have destructors implicitly called.
> +  if (ClassDecl->isDependentContext() || ClassDecl->isUnion())
>     return;
> 
>   // FIXME: all the access-control diagnostics are positioned on the
> 
> Added: cfe/trunk/test/CodeGenCXX/union-dtor.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/union-dtor.cpp?rev=139997&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/union-dtor.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/union-dtor.cpp Sun Sep 18 07:11:43 2011
> @@ -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
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list