[cfe-commits] r161534 - in /cfe/trunk: include/clang/Parse/Parser.h include/clang/Sema/DeclSpec.h lib/Parse/ParseDecl.cpp lib/Parse/ParseObjc.cpp lib/Parse/RAIIObjectsForParser.h test/Sema/attr-deprecated.c test/SemaObjC/attr-deprecated.m

jahanian fjahanian at apple.com
Wed Aug 8 16:30:51 PDT 2012


Build is broken:

/Users/jahanian/sandbox/llvm-tot/tools/clang/lib/Parse/ParseDecl.cpp:2830:5: error: use of undeclared identifier 'PD'
    PD.complete(D);
    ^
I tried to un-break it by replacing it with DS. It built but broke clang-tests. 

- Fariborz

On Aug 8, 2012, at 4:04 PM, Eli Friedman wrote:

> Author: efriedma
> Date: Wed Aug  8 18:04:35 2012
> New Revision: 161534
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=161534&view=rev
> Log:
> Handle deprecation diagnostics correctly for C struct fields and Objective-C properties/ivars. <rdar://problem/6642337>.
> 
> 
> Modified:
>    cfe/trunk/include/clang/Parse/Parser.h
>    cfe/trunk/include/clang/Sema/DeclSpec.h
>    cfe/trunk/lib/Parse/ParseDecl.cpp
>    cfe/trunk/lib/Parse/ParseObjc.cpp
>    cfe/trunk/lib/Parse/RAIIObjectsForParser.h
>    cfe/trunk/test/Sema/attr-deprecated.c
>    cfe/trunk/test/SemaObjC/attr-deprecated.m
> 
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=161534&r1=161533&r2=161534&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Wed Aug  8 18:04:35 2012
> @@ -36,6 +36,7 @@
>   class ParsingDeclRAIIObject;
>   class ParsingDeclSpec;
>   class ParsingDeclarator;
> +  class ParsingFieldDeclarator;
>   class PragmaUnusedHandler;
>   class ColonProtectionRAIIObject;
>   class InMessageExpressionRAIIObject;
> @@ -1559,7 +1560,7 @@
>                             Decl *TagDecl);
> 
>   struct FieldCallback {
> -    virtual Decl *invoke(FieldDeclarator &Field) = 0;
> +    virtual Decl *invoke(ParsingFieldDeclarator &Field) = 0;
>     virtual ~FieldCallback() {}
> 
>   private:
> @@ -1567,7 +1568,7 @@
>   };
>   struct ObjCPropertyCallback;
> 
> -  void ParseStructDeclaration(DeclSpec &DS, FieldCallback &Callback);
> +  void ParseStructDeclaration(ParsingDeclSpec &DS, FieldCallback &Callback);
> 
>   bool isDeclarationSpecifier(bool DisambiguatingWithExpression = false);
>   bool isTypeSpecifierQualifier();
> 
> Modified: cfe/trunk/include/clang/Sema/DeclSpec.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/DeclSpec.h?rev=161534&r1=161533&r2=161534&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/DeclSpec.h (original)
> +++ cfe/trunk/include/clang/Sema/DeclSpec.h Wed Aug  8 18:04:35 2012
> @@ -1932,9 +1932,8 @@
> struct FieldDeclarator {
>   Declarator D;
>   Expr *BitfieldSize;
> -  explicit FieldDeclarator(DeclSpec &DS) : D(DS, Declarator::MemberContext) {
> -    BitfieldSize = 0;
> -  }
> +  explicit FieldDeclarator(const DeclSpec &DS)
> +    : D(DS, Declarator::MemberContext), BitfieldSize(0) { }
> };
> 
> /// \brief Represents a C++11 virt-specifier-seq.
> 
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=161534&r1=161533&r2=161534&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Wed Aug  8 18:04:35 2012
> @@ -2773,7 +2773,7 @@
> /// [GNU]   declarator[opt] ':' constant-expression attributes[opt]
> ///
> void Parser::
> -ParseStructDeclaration(DeclSpec &DS, FieldCallback &Fields) {
> +ParseStructDeclaration(ParsingDeclSpec &DS, FieldCallback &Fields) {
> 
>   if (Tok.is(tok::kw___extension__)) {
>     // __extension__ silences extension warnings in the subexpression.
> @@ -2788,7 +2788,9 @@
>   // If there are no declarators, this is a free-standing declaration
>   // specifier. Let the actions module cope with it.
>   if (Tok.is(tok::semi)) {
> -    Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS_none, DS);
> +    Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS_none,
> +                                                       DS);
> +    DS.complete(TheDecl);
>     return;
>   }
> 
> @@ -2796,8 +2798,7 @@
>   bool FirstDeclarator = true;
>   SourceLocation CommaLoc;
>   while (1) {
> -    ParsingDeclRAIIObject PD(*this, ParsingDeclRAIIObject::NoParent);
> -    FieldDeclarator DeclaratorInfo(DS);
> +    ParsingFieldDeclarator DeclaratorInfo(*this, DS);
>     DeclaratorInfo.D.setCommaLoc(CommaLoc);
> 
>     // Attributes are only allowed here on successive declarators.
> @@ -2881,9 +2882,6 @@
>       continue;
>     }
> 
> -    // Parse all the comma separated declarators.
> -    DeclSpec DS(AttrFactory);
> -
>     if (!Tok.is(tok::at)) {
>       struct CFieldCallback : FieldCallback {
>         Parser &P;
> @@ -2894,16 +2892,19 @@
>                        SmallVectorImpl<Decl *> &FieldDecls) :
>           P(P), TagDecl(TagDecl), FieldDecls(FieldDecls) {}
> 
> -        virtual Decl *invoke(FieldDeclarator &FD) {
> +        virtual Decl *invoke(ParsingFieldDeclarator &FD) {
>           // Install the declarator into the current TagDecl.
>           Decl *Field = P.Actions.ActOnField(P.getCurScope(), TagDecl,
>                               FD.D.getDeclSpec().getSourceRange().getBegin(),
>                                                  FD.D, FD.BitfieldSize);
>           FieldDecls.push_back(Field);
> +          FD.complete(Field);
>           return Field;
>         }
>       } Callback(*this, TagDecl, FieldDecls);
> 
> +      // Parse all the comma separated declarators.
> +      ParsingDeclSpec DS(*this);
>       ParseStructDeclaration(DS, Callback);
>     } else { // Handle @defs
>       ConsumeToken();
> 
> Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=161534&r1=161533&r2=161534&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseObjc.cpp Wed Aug  8 18:04:35 2012
> @@ -308,7 +308,7 @@
>     MethodImplKind(MethodImplKind) {
>   }
> 
> -  Decl *invoke(FieldDeclarator &FD) {
> +  Decl *invoke(ParsingFieldDeclarator &FD) {
>     if (FD.D.getIdentifier() == 0) {
>       P.Diag(AtLoc, diag::err_objc_property_requires_field_name)
>         << FD.D.getSourceRange();
> @@ -344,6 +344,7 @@
>     if (!isOverridingProperty)
>       Props.push_back(Property);
> 
> +    FD.complete(Property);
>     return Property;
>   }
> };
> @@ -493,7 +494,7 @@
>                                     OCDS, AtLoc, LParenLoc, MethodImplKind);
> 
>       // Parse all the comma separated declarators.
> -      DeclSpec DS(AttrFactory);
> +      ParsingDeclSpec DS(*this);
>       ParseStructDeclaration(DS, Callback);
> 
>       ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list);
> @@ -1306,7 +1307,7 @@
>         P(P), IDecl(IDecl), visibility(V), AllIvarDecls(AllIvarDecls) {
>       }
> 
> -      Decl *invoke(FieldDeclarator &FD) {
> +      Decl *invoke(ParsingFieldDeclarator &FD) {
>         P.Actions.ActOnObjCContainerStartDefinition(IDecl);
>         // Install the declarator into the interface decl.
>         Decl *Field
> @@ -1316,12 +1317,13 @@
>         P.Actions.ActOnObjCContainerFinishDefinition();
>         if (Field)
>           AllIvarDecls.push_back(Field);
> +        FD.complete(Field);
>         return Field;
>       }
>     } Callback(*this, interfaceDecl, visibility, AllIvarDecls);
> 
>     // Parse all the comma separated declarators.
> -    DeclSpec DS(AttrFactory);
> +    ParsingDeclSpec DS(*this);
>     ParseStructDeclaration(DS, Callback);
> 
>     if (Tok.is(tok::semi)) {
> 
> Modified: cfe/trunk/lib/Parse/RAIIObjectsForParser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/RAIIObjectsForParser.h?rev=161534&r1=161533&r2=161534&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/RAIIObjectsForParser.h (original)
> +++ cfe/trunk/lib/Parse/RAIIObjectsForParser.h Wed Aug  8 18:04:35 2012
> @@ -218,6 +218,28 @@
>     }
>   };
> 
> +  /// A class for parsing a field declarator.
> +  class ParsingFieldDeclarator : public FieldDeclarator {
> +    ParsingDeclRAIIObject ParsingRAII;
> +
> +  public:
> +    ParsingFieldDeclarator(Parser &P, const ParsingDeclSpec &DS)
> +      : FieldDeclarator(DS), ParsingRAII(P, &DS.getDelayedDiagnosticPool()) {
> +    }
> +
> +    const ParsingDeclSpec &getDeclSpec() const {
> +      return static_cast<const ParsingDeclSpec&>(D.getDeclSpec());
> +    }
> +
> +    ParsingDeclSpec &getMutableDeclSpec() const {
> +      return const_cast<ParsingDeclSpec&>(getDeclSpec());
> +    }
> +
> +    void complete(Decl *D) {
> +      ParsingRAII.complete(D);
> +    }
> +  };
> +
>   /// ExtensionRAIIObject - This saves the state of extension warnings when
>   /// constructed and disables them.  When destructed, it restores them back to
>   /// the way they used to be.  This is used to handle __extension__ in the
> 
> Modified: cfe/trunk/test/Sema/attr-deprecated.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-deprecated.c?rev=161534&r1=161533&r2=161534&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/attr-deprecated.c (original)
> +++ cfe/trunk/test/Sema/attr-deprecated.c Wed Aug  8 18:04:35 2012
> @@ -41,7 +41,7 @@
>   struct foo f2 = { 17 }; // expected-warning {{'x' is deprecated}}
> }
> 
> -typedef struct foo foo_dep __attribute__((deprecated)); // expected-note 10 {{declared here}}
> +typedef struct foo foo_dep __attribute__((deprecated)); // expected-note 12 {{declared here}}
> foo_dep *test2;    // expected-warning {{'foo_dep' is deprecated}}
> 
> struct __attribute__((deprecated, 
> @@ -113,3 +113,10 @@
> }
> 
> char test21[__has_feature(attribute_deprecated_with_message) ? 1 : -1];
> +
> +struct test22 {
> +  foo_dep a __attribute((deprecated));
> +  foo_dep b; // expected-warning {{'foo_dep' is deprecated}}
> +  foo_dep c, d __attribute((deprecated)); // expected-warning {{'foo_dep' is deprecated}}
> +  __attribute((deprecated)) foo_dep e, f;
> +};
> 
> Modified: cfe/trunk/test/SemaObjC/attr-deprecated.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-deprecated.m?rev=161534&r1=161533&r2=161534&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaObjC/attr-deprecated.m (original)
> +++ cfe/trunk/test/SemaObjC/attr-deprecated.m Wed Aug  8 18:04:35 2012
> @@ -121,3 +121,16 @@
> __attribute__((deprecated))
> @interface A(Blah) // expected-error{{attributes may not be specified on a category}}
> @end
> +
> +
> +typedef struct {
> +	int x;
> +} footype __attribute((deprecated)); // expected-note 2 {{declared here}}
> +
> + at interface foo {
> +	footype a; // expected-warning {{'footype' is deprecated}}
> +	footype b __attribute((deprecated));
> +}
> + at property footype c; // expected-warning {{'footype' is deprecated}}
> + at property footype d __attribute((deprecated));
> + at end
> 
> 
> _______________________________________________
> 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