[cfe-commits] [patch] semantic analysis for union members in C++

Douglas Gregor dgregor at apple.com
Wed Jul 22 11:25:32 PDT 2009


Hi John,

On Jul 21, 2009, at 11:09 PM, John McCall wrote:

> This patch implements the restrictions on union members detailed in  
> [class.union]p1, analyzing code like this:

Great!

> class Dtor {
> ~Dtor() { abort(); }
> };
> union U3 {
> struct s6 : Dtor {
> } m6;
> };
>
> to produce errors like this:
>
> test/CXX/class/class.union/p1.cpp:79:5: error: union member 'm6' has  
> a non-trivial destructor
> } m6;
> ^
> test/CXX/class/class.union/p1.cpp:78:15: note: because type 'struct  
> U3::s6' has a base class with a non-trivial destructor
> struct s6 : Dtor {
> ^
> test/CXX/class/class.union/p1.cpp:30:3: note: because type 'class  
> Dtor' has a user-declared destructor
> ~Dtor() { abort(); }
> ^

Very nice :)

> I went ahead and implemented a few bits of convenient API — in  
> particular, CXXRecordDecl::method_iterator and ::ctor_iterator — and  
> fixed a few mildly-related bugs, including a very small memory leak  
> which happened on every derivation from a virtual base class. If  
> people want me to tease these out into a separate patch, that's not  
> a problem.


I've committed this with a few minor tweaks, mentioned below. Thanks!

>
> Index: include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSemaKinds.td	(revision 76721)
> +++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
> @@ -339,6 +339,18 @@ def err_implicit_object_parameter_init :
>   "cannot initialize object parameter of type %0 with an expression "
>   "of type %1">;
>
> +def err_illegal_union_member : Error<
> +  "union member %0 has a non-trivial %select{constructor|"
> +  "copy constructor|copy assignment operator|destructor}1">;
> +def note_nontrivial_has_virtual : Note<
> +  "because type %0 has a virtual %select{method|base class}1">;

That should be "member function", not "method", for C++. (We reserve  
the term "method" for Objective-C).

> /// TranslateIvarVisibility - Translate visibility from a token ID  
> to an
> ///  AST enum value.
> static ObjCIvarDecl::AccessControl
> Index: lib/Sema/Sema.h
> ===================================================================
> --- lib/Sema/Sema.h	(revision 76721)
> +++ lib/Sema/Sema.h	(working copy)
> @@ -540,6 +540,14 @@ public:
>                             SourceLocation TSSL,
>                             AccessSpecifier AS, NamedDecl *PrevDecl,
>                             Declarator *D = 0);
> +
> +  enum cxx_special_member {
> +    cxx_default_constructor = 0,
> +    cxx_copy_constructor = 1,
> +    cxx_copy_assignment = 2,
> +    cxx_destructor = 3
> +  };
> +  void DiagnoseNontrivial(const RecordType* Record,  
> cxx_special_member mem);

We often use CamelCase for enumerator types and enumerators, so I've  
tweaked this to:

   enum CXXSpecialMember {
     CXXDefaultConstructor = 0,
     CXXCopyConstructor = 1,
     CXXCopyAssignment = 2,
     CXXDestructor = 3
   };

Committed as r76766.

	- Doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20090722/4a20b39c/attachment.html>


More information about the cfe-commits mailing list