[cfe-dev] ParseClassSpecifier: can "unions" inherit?
Argiris Kirtzidis
akyrtzi at gmail.com
Thu Sep 4 20:06:28 PDT 2008
steve naroff wrote:
> On Sep 4, 2008, at 12:19 PM, Nico Weber wrote:
>
>
>> 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;
>> }
>>
>>
>
> That's odd - it seems like this should be diagnosed by the parser.
> Since I'm not very familiar with all the "challenges" of implementing C
> ++:-), I'll understand if this isn't convenient.
>
Doug can probably explain it better, but it's not the C++ grammar that
disallows union inheriting, it's the "semantic rules".
Also, in general, as suggested by Chris here:
http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-June/002004.html
it's better for the Parser to be as "relaxed" as possible and defer
error checking to Sema (where appropriate).
-Argiris
More information about the cfe-dev
mailing list