[cfe-commits] r85855 - in /cfe/trunk: include/clang/Parse/Parser.h lib/Parse/ParseDecl.cpp lib/Parse/ParseObjc.cpp

steve naroff snaroff at apple.com
Thu Dec 3 12:54:32 PST 2009


Hi John,

The commit below seems to have broken the Windows build (see screen  
shot for more info).

Any clues?

Thanks,

snaroff
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Picture 1.png
Type: image/png
Size: 587726 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20091203/80db26f3/attachment.png>
-------------- next part --------------



On Nov 2, 2009, at 9: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.
>
>
> 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);
> +          }
> +          FieldDecls.push_back(Field);
> +          return Field;
>         }
> -        FieldDecls.push_back(Field);
> -      }
> +      } Callback(*this, TagDecl, FieldDecls);
> +
> +      ParseStructDeclaration(DS, Callback);
>     } else { // Handle @defs
>       ConsumeToken();
>       if (!Tok.isObjCAtKeyword(tok::objc_defs)) {
>
> Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=85855&r1=85854&r2=85855&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseObjc.cpp Mon Nov  2 20:38:08 2009
> @@ -305,51 +305,68 @@
>       if (Tok.is(tok::l_paren))
>         ParseObjCPropertyAttribute(OCDS);
>
> +      struct ObjCPropertyCallback : FieldCallback {
> +        Parser &P;
> +        DeclPtrTy IDecl;
> +        llvm::SmallVectorImpl<DeclPtrTy> &Props;
> +        ObjCDeclSpec &OCDS;
> +        SourceLocation AtLoc;
> +        tok::ObjCKeywordKind MethodImplKind;
> +
> +        ObjCPropertyCallback(Parser &P, DeclPtrTy IDecl,
> +                             llvm::SmallVectorImpl<DeclPtrTy> &Props,
> +                             ObjCDeclSpec &OCDS, SourceLocation  
> AtLoc,
> +                             tok::ObjCKeywordKind MethodImplKind) :
> +          P(P), IDecl(IDecl), Props(Props), OCDS(OCDS), AtLoc(AtLoc),
> +          MethodImplKind(MethodImplKind) {
> +        }
> +
> +        DeclPtrTy invoke(FieldDeclarator &FD) {
> +          if (FD.D.getIdentifier() == 0) {
> +            P.Diag(AtLoc,  
> diag::err_objc_property_requires_field_name)
> +              << FD.D.getSourceRange();
> +            return DeclPtrTy();
> +          }
> +          if (FD.BitfieldSize) {
> +            P.Diag(AtLoc, diag::err_objc_property_bitfield)
> +              << FD.D.getSourceRange();
> +            return DeclPtrTy();
> +          }
> +
> +          // Install the property declarator into interfaceDecl.
> +          IdentifierInfo *SelName =
> +            OCDS.getGetterName() ? OCDS.getGetterName() :  
> FD.D.getIdentifier();
> +
> +          Selector GetterSel =
> +            P.PP.getSelectorTable().getNullarySelector(SelName);
> +          IdentifierInfo *SetterName = OCDS.getSetterName();
> +          Selector SetterSel;
> +          if (SetterName)
> +            SetterSel = P.PP.getSelectorTable().getSelector(1,  
> &SetterName);
> +          else
> +            SetterSel =  
> SelectorTable::constructSetterName(P.PP.getIdentifierTable(),
> +                                                            
> P.PP.getSelectorTable(),
> +                                                            
> FD.D.getIdentifier());
> +          bool isOverridingProperty = false;
> +          DeclPtrTy Property =
> +            P.Actions.ActOnProperty(P.CurScope, AtLoc, FD, OCDS,
> +                                    GetterSel, SetterSel, IDecl,
> +                                    &isOverridingProperty,
> +                                    MethodImplKind);
> +          if (!isOverridingProperty)
> +            Props.push_back(Property);
> +
> +          return Property;
> +        }
> +      } Callback(*this, interfaceDecl, allProperties,
> +                 OCDS, AtLoc, MethodImplKind);
> +
>       // Parse all the comma separated declarators.
>       DeclSpec DS;
> -      llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
> -      ParseStructDeclaration(DS, FieldDeclarators);
> +      ParseStructDeclaration(DS, Callback);
>
>       ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list,  
> "",
>                        tok::at);
> -
> -      // Convert them all to property declarations.
> -      for (unsigned i = 0, e = FieldDeclarators.size(); i != e; + 
> +i) {
> -        FieldDeclarator &FD = FieldDeclarators[i];
> -        if (FD.D.getIdentifier() == 0) {
> -          Diag(AtLoc, diag::err_objc_property_requires_field_name)
> -            << FD.D.getSourceRange();
> -          continue;
> -        }
> -        if (FD.BitfieldSize) {
> -          Diag(AtLoc, diag::err_objc_property_bitfield)
> -            << FD.D.getSourceRange();
> -          continue;
> -        }
> -
> -        // Install the property declarator into interfaceDecl.
> -        IdentifierInfo *SelName =
> -          OCDS.getGetterName() ? OCDS.getGetterName() :  
> FD.D.getIdentifier();
> -
> -        Selector GetterSel =
> -          PP.getSelectorTable().getNullarySelector(SelName);
> -        IdentifierInfo *SetterName = OCDS.getSetterName();
> -        Selector SetterSel;
> -        if (SetterName)
> -          SetterSel = PP.getSelectorTable().getSelector(1,  
> &SetterName);
> -        else
> -          SetterSel =  
> SelectorTable::constructSetterName(PP.getIdentifierTable(),
> -                                                          
> PP.getSelectorTable(),
> -                                                          
> FD.D.getIdentifier());
> -        bool isOverridingProperty = false;
> -        DeclPtrTy Property = Actions.ActOnProperty(CurScope, AtLoc,  
> FD, OCDS,
> -                                                   GetterSel,  
> SetterSel,
> -                                                   interfaceDecl,
> -                                                    
> &isOverridingProperty,
> -                                                   MethodImplKind);
> -        if (!isOverridingProperty)
> -          allProperties.push_back(Property);
> -      }
>       break;
>     }
>   }
> @@ -858,7 +875,6 @@
>                                              SourceLocation atLoc) {
>   assert(Tok.is(tok::l_brace) && "expected {");
>   llvm::SmallVector<DeclPtrTy, 32> AllIvarDecls;
> -  llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
>
>   ParseScope ClassScope(this, Scope::DeclScope|Scope::ClassScope);
>
> @@ -893,21 +909,31 @@
>       }
>     }
>
> +    struct ObjCIvarCallback : FieldCallback {
> +      Parser &P;
> +      DeclPtrTy IDecl;
> +      tok::ObjCKeywordKind visibility;
> +      llvm::SmallVectorImpl<DeclPtrTy> &AllIvarDecls;
> +
> +      ObjCIvarCallback(Parser &P, DeclPtrTy IDecl,  
> tok::ObjCKeywordKind V,
> +                       llvm::SmallVectorImpl<DeclPtrTy>  
> &AllIvarDecls) :
> +        P(P), IDecl(IDecl), visibility(V),  
> AllIvarDecls(AllIvarDecls) {
> +      }
> +
> +      DeclPtrTy invoke(FieldDeclarator &FD) {
> +        // Install the declarator into the interface decl.
> +        DeclPtrTy Field
> +          = P.Actions.ActOnIvar(P.CurScope,
> +                                 
> FD.D.getDeclSpec().getSourceRange().getBegin(),
> +                                IDecl, FD.D, FD.BitfieldSize,  
> visibility);
> +        AllIvarDecls.push_back(Field);
> +        return Field;
> +      }
> +    } Callback(*this, interfaceDecl, visibility, AllIvarDecls);
> +
>     // Parse all the comma separated declarators.
>     DeclSpec DS;
> -    FieldDeclarators.clear();
> -    ParseStructDeclaration(DS, FieldDeclarators);
> -
> -    // Convert them all to fields.
> -    for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) {
> -      FieldDeclarator &FD = FieldDeclarators[i];
> -      // Install the declarator into interfaceDecl.
> -      DeclPtrTy Field = Actions.ActOnIvar(CurScope,
> -                                           
> DS.getSourceRange().getBegin(),
> -                                          interfaceDecl,
> -                                          FD.D, FD.BitfieldSize,  
> visibility);
> -      AllIvarDecls.push_back(Field);
> -    }
> +    ParseStructDeclaration(DS, Callback);
>
>     if (Tok.is(tok::semi)) {
>       ConsumeToken();
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list