[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 21:56:13 PDT 2011



Sent from my iPhone

On Sep 19, 2011, at 7:14 PM, Richard Smith <richard at metafoo.co.uk> wrote:

> On Mon, September 19, 2011 15:43, Douglas Gregor wrote:
>> 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?
> 
> We just directly call the destructor for the implicit anonymous union object
> at the end of its lifetime, so this patch covers such cases too. Also, if the
> anonymous union contains a data member with a non-trivial destructor, the code
> is ill-formed anyway (since the union's implicit destructor is defined
> deleted, and it's not possible to explicitly define a destructor) -- but clang
> does not yet implement that rule.

Ah, that makes sense. Thanks! 

>>> 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=1
>>> 39997&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.cp
>>> p?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
> 
> 



More information about the cfe-commits mailing list