[cfe-commits] r85855 - in /cfe/trunk: include/clang/Parse/Parser.h lib/Parse/ParseDecl.cpp lib/Parse/ParseObjc.cpp
Edward O'Callaghan
eocallaghan at auroraux.org
Tue Nov 3 07:54:42 PST 2009
G'Day,
I believe this may of introduced the following warning, not sure:
/home/evocallaghan/lab/llvm/llvm/tools/clang/tools/clang-cc/../../include/clang/Parse/Parser.h:983:
warning: 'struct clang::Parser::FieldCallback' has virtual functions
but non-virtual destructor
edward at Thor:/home/edward> gcc --version
gcc (GCC) 4.1.2 (DragonFly)
Cheers,
Edward.
2009/11/3 Douglas Gregor <dgregor at apple.com>:
>
> On Nov 2, 2009, at 6:38 PM, John McCall wrote:
>
>> Author: rjmccall
>> Date: Mon Nov 2 20:38:08 2009
>> New Revision: 85855
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=85855&view=rev
>> Log:
>> Switch ParseStructDeclaration to a callback-based API. This will make
>> it easier to track within Sema whether the parser is parsing a
>> declaration.
>
> Interesting approach to the problem, but I like that we have fewer
> places parsing comma-separated lists of declarators. One comment
> below...
>
>> Modified:
>> cfe/trunk/include/clang/Parse/Parser.h
>> cfe/trunk/lib/Parse/ParseDecl.cpp
>> cfe/trunk/lib/Parse/ParseObjc.cpp
>>
>> Modified: cfe/trunk/include/clang/Parse/Parser.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=85855&r1=85854&r2=85855&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> --- cfe/trunk/include/clang/Parse/Parser.h (original)
>> +++ cfe/trunk/include/clang/Parse/Parser.h Mon Nov 2 20:38:08 2009
>> @@ -979,8 +979,12 @@
>> void ParseEnumBody(SourceLocation StartLoc, DeclPtrTy TagDecl);
>> void ParseStructUnionBody(SourceLocation StartLoc, unsigned TagType,
>> DeclPtrTy TagDecl);
>> - void ParseStructDeclaration(DeclSpec &DS,
>> -
>> llvm::SmallVectorImpl<FieldDeclarator> &Fields);
>> +
>> + struct FieldCallback {
>> + virtual DeclPtrTy invoke(FieldDeclarator &Field) = 0;
>> + };
>> +
>> + void ParseStructDeclaration(DeclSpec &DS, FieldCallback &Callback);
>>
>> bool isDeclarationSpecifier();
>> bool isTypeSpecifierQualifier();
>>
>> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=85855&r1=85854&r2=85855&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
>> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Mon Nov 2 20:38:08 2009
>> @@ -1468,8 +1468,7 @@
>> /// [GNU] declarator[opt] ':' constant-expression attributes[opt]
>> ///
>> void Parser::
>> -ParseStructDeclaration(DeclSpec &DS,
>> - llvm::SmallVectorImpl<FieldDeclarator>
>> &Fields) {
>> +ParseStructDeclaration(DeclSpec &DS, FieldCallback &Fields) {
>> if (Tok.is(tok::kw___extension__)) {
>> // __extension__ silences extension warnings in the subexpression.
>> ExtensionRAIIObject O(Diags); // Use RAII to do this.
>> @@ -1489,9 +1488,16 @@
>> }
>>
>> // Read struct-declarators until we find the semicolon.
>> - Fields.push_back(FieldDeclarator(DS));
>> + bool FirstDeclarator = true;
>> while (1) {
>> - FieldDeclarator &DeclaratorInfo = Fields.back();
>> + FieldDeclarator DeclaratorInfo(DS);
>> +
>> + // Attributes are only allowed here on successive declarators.
>> + if (!FirstDeclarator && Tok.is(tok::kw___attribute)) {
>> + SourceLocation Loc;
>> + AttributeList *AttrList = ParseAttributes(&Loc);
>> + DeclaratorInfo.D.AddAttributes(AttrList, Loc);
>> + }
>>
>> /// struct-declarator: declarator
>> /// struct-declarator: declarator[opt] ':' constant-expression
>> @@ -1514,6 +1520,9 @@
>> DeclaratorInfo.D.AddAttributes(AttrList, Loc);
>> }
>>
>> + // We're done with this declarator; invoke the callback.
>> + (void) Fields.invoke(DeclaratorInfo);
>> +
>> // If we don't have a comma, it is either the end of the list (a
>> ';')
>> // or an error, bail out.
>> if (Tok.isNot(tok::comma))
>> @@ -1522,15 +1531,7 @@
>> // Consume the comma.
>> ConsumeToken();
>>
>> - // Parse the next declarator.
>> - Fields.push_back(FieldDeclarator(DS));
>> -
>> - // Attributes are only allowed on the second declarator.
>> - if (Tok.is(tok::kw___attribute)) {
>> - SourceLocation Loc;
>> - AttributeList *AttrList = ParseAttributes(&Loc);
>> - Fields.back().D.AddAttributes(AttrList, Loc);
>> - }
>> + FirstDeclarator = false;
>> }
>> }
>>
>> @@ -1562,7 +1563,6 @@
>> << DeclSpec::getSpecifierName((DeclSpec::TST)TagType);
>>
>> llvm::SmallVector<DeclPtrTy, 32> FieldDecls;
>> - llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
>>
>> // While we still have something to read, read the declarations in
>> the struct.
>> while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
>> @@ -1578,28 +1578,39 @@
>>
>> // Parse all the comma separated declarators.
>> DeclSpec DS;
>> - FieldDeclarators.clear();
>> - if (!Tok.is(tok::at)) {
>> - ParseStructDeclaration(DS, FieldDeclarators);
>>
>> - // Convert them all to fields.
>> - for (unsigned i = 0, e = FieldDeclarators.size(); i != e; +
>> +i) {
>> - FieldDeclarator &FD = FieldDeclarators[i];
>> - DeclPtrTy Field;
>> - // Install the declarator into the current TagDecl.
>> - if (FD.D.getExtension()) {
>> - // Silences extension warnings
>> - ExtensionRAIIObject O(Diags);
>> - Field = Actions.ActOnField(CurScope, TagDecl,
>> - DS.getSourceRange().getBegin(),
>> - FD.D, FD.BitfieldSize);
>> - } else {
>> - Field = Actions.ActOnField(CurScope, TagDecl,
>> - DS.getSourceRange().getBegin(),
>> - FD.D, FD.BitfieldSize);
>> + if (!Tok.is(tok::at)) {
>> + struct CFieldCallback : FieldCallback {
>> + Parser &P;
>> + DeclPtrTy TagDecl;
>> + llvm::SmallVectorImpl<DeclPtrTy> &FieldDecls;
>> +
>> + CFieldCallback(Parser &P, DeclPtrTy TagDecl,
>> + llvm::SmallVectorImpl<DeclPtrTy>
>> &FieldDecls) :
>> + P(P), TagDecl(TagDecl), FieldDecls(FieldDecls) {}
>> +
>> + virtual DeclPtrTy invoke(FieldDeclarator &FD) {
>> + const DeclSpec &DS = FD.D.getDeclSpec();
>> + DeclPtrTy Field;
>> +
>> + // Install the declarator into the current TagDecl.
>> + if (FD.D.getExtension()) {
>> + // Silences extension warnings
>> + ExtensionRAIIObject O(P.Diags);
>> + Field = P.Actions.ActOnField(P.CurScope, TagDecl,
>> + DS.getSourceRange
>> ().getBegin(),
>> + FD.D, FD.BitfieldSize);
>> + } else {
>> + Field = P.Actions.ActOnField(P.CurScope, TagDecl,
>> + DS.getSourceRange
>> ().getBegin(),
>> + FD.D, FD.BitfieldSize);
>> + }
>
> Could you move this __extension__ logic out of CFieldCallback and into
> ParseStructDeclaration? Right now, Objective-C properties and ivars
> don't have this logic.
>
> - Doug
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
--
--
Edward O'Callaghan
http://www.auroraux.org/
eocallaghan at auroraux dot org
More information about the cfe-commits
mailing list