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 edw...@thor:/home/edward> gcc --version gcc (GCC) 4.1.2 (DragonFly) Cheers, Edward. 2009/11/3 Douglas Gregor <[email protected]>: > > 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > -- -- Edward O'Callaghan http://www.auroraux.org/ eocallaghan at auroraux dot org _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
