[LLVMbugs] [Bug 10304] New: unrestricted unions call *all* constructors/destructors for member types

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Thu Jul 7 14:38:35 PDT 2011


http://llvm.org/bugs/show_bug.cgi?id=10304

           Summary: unrestricted unions call *all*
                    constructors/destructors for member types
           Product: clang
           Version: trunk
          Platform: Macintosh
        OS/Version: MacOS X
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++0x
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: oneill+llvmbugs at cs.hmc.edu
                CC: llvmbugs at cs.uiuc.edu, dgregor at apple.com


Created an attachment (id=6853)
 --> (http://llvm.org/bugs/attachment.cgi?id=6853)
unionbad.cpp — example of unrestricted union bug

When a union is constructed, generated code calls default constructors for
*all* member types.

Likewise when a union is destroyed, generated code calls *all* destructors.

Back when unions only had POD types (and thus constructors/destructors were all
do-nothing actions, this was harmless, but currently clang allows non-POD types
in unions in c++0x mode, with extremely surprising results.)


> clang++ -std=c++0x -Wall -o unionbad unionbad.cpp
> ./unionbad 
Foo at 0x7fff5fbff218 created
Bar at 0x7fff5fbff218 created
FooBar (union) at 0x7fff5fbff218 created
FooBar (union) at 0x7fff5fbff218 destroyed
Bar at 0x7fff5fbff218 destroyed
Foo at 0x7fff5fbff218 destroyed

c.f.

> g++-mp-4.6 -std=c++0x -Wall -o unionbad unionbad.cpp
> ./unionbad 
FooBar (union) at 0x7fff5fbff21f created
FooBar (union) at 0x7fff5fbff21f destroyed

P.S.  I realize (now) that unrestricted unions aren't officially supported yet
(despite coppro's comment at r131432), but I think that miscompiling
unsupported c++0x code can lead to subtle and suprising bugs for the unwary.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list