[cfe-dev] ParseClassSpecifier: can "unions" inherit?

Nico Weber nicolasweber at gmx.de
Thu Sep 4 09:19:14 PDT 2008


Hi,

On 04.09.2008, at 18:01, Ted Kremenek wrote:

> I just noticed the following code fragment in ParseClassSpecifier:
>
>   // Parse the tag portion of this.
>   DeclTy *TagDecl = Actions.ActOnTag(CurScope, TagType, TK, StartLoc,
> Name,
>                                      NameLoc, Attr);
>
>   // Parse the optional base clause (C++ only).
>   if (getLang().CPlusPlus && Tok.is(tok::colon)) {
>     ParseBaseClause(TagDecl);
>   }
>
> It appears from the code that the 'if' branch can be taken even if the
> tag decl is a union.  Is this valid in the C++ grammar?  That is, can
> there be a "base clause" for unions in C++, and if so, what does that
> mean?

it seems not to be allowed -- at least both gcc and clang reject it.  
Clang does it in ActOnBaseSpecifier in Sema:

   // C++ [class.union]p1:
   //   A union shall not be used as a base class.
   if (BaseType->isUnionType()) {
     Diag(BaseLoc, diag::err_union_as_base_class, SpecifierRange);
     return;
   }

Nico



More information about the cfe-dev mailing list