r187557 - Parse: Don't consider attributes of broken member declarators

David Majnemer david.majnemer at gmail.com
Thu Aug 1 16:24:18 PDT 2013


On Thu, Aug 1, 2013 at 1:40 PM, Matt Beaumont-Gay <matthewbg at google.com>wrote:

> Thanks, this has been on my priority queue, but not near the top, for
> a couple of weeks.
>
> On Wed, Jul 31, 2013 at 9:22 PM, David Majnemer
> <david.majnemer at gmail.com> wrote:
> > Author: majnemer
> > Date: Wed Jul 31 23:22:55 2013
> > New Revision: 187557
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=187557&view=rev
> > Log:
> > Parse: Don't consider attributes of broken member declarators
> >
> > ParseCXXClassMemberDeclaration was trying to use the result of
> > ActOnCXXMemberDeclarator to attach it to some late parsed attributes.
> >
> > However when failures arise, we have no decl to attach to which
> > eventually leads us to a NULL pointer dereference.
> >
> > While we are here, clean up the code a bit.
>
> Please avoid mixing unrelated formatting changes in with
> semantics-changing commits.
>

Normally I would, it was done on special request for Richard :)


>
> >
> > Fixes PR16765
> >
> > Modified:
> >     cfe/trunk/lib/Parse/ParseDeclCXX.cpp
> >     cfe/trunk/test/Parser/cxx-attributes.cpp
> >
> > Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=187557&r1=187556&r2=187557&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
> > +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Wed Jul 31 23:22:55 2013
> > @@ -2164,11 +2164,13 @@ void Parser::ParseCXXClassMemberDeclarat
> >          ParseCXXInlineMethodDef(AS, AccessAttrs, DeclaratorInfo,
> TemplateInfo,
> >                                  VS, DefinitionKind, Init);
> >
> > -      for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni;
> ++i) {
> > -        CommonLateParsedAttrs[i]->addDecl(FunDecl);
> > -      }
> > -      for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) {
> > -        LateParsedAttrs[i]->addDecl(FunDecl);
> > +      if (FunDecl) {
> > +        for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni;
> ++i) {
> > +          CommonLateParsedAttrs[i]->addDecl(FunDecl);
> > +        }
> > +        for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) {
> > +          LateParsedAttrs[i]->addDecl(FunDecl);
> > +        }
> >        }
> >        LateParsedAttrs.clear();
> >
> > @@ -2262,28 +2264,19 @@ void Parser::ParseCXXClassMemberDeclarat
> >                                                    TemplateParams,
> >
>  BitfieldSize.release(),
> >                                                    VS, HasInClassInit);
> > -      if (AccessAttrs)
> > +      if (ThisDecl && AccessAttrs)
> >          Actions.ProcessDeclAttributeList(getCurScope(), ThisDecl,
> AccessAttrs,
> >                                           false, true);
> >      }
> > -
> > -    // Set the Decl for any late parsed attributes
> > -    for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni;
> ++i) {
> > -      CommonLateParsedAttrs[i]->addDecl(ThisDecl);
> > -    }
> > -    for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) {
> > -      LateParsedAttrs[i]->addDecl(ThisDecl);
> > -    }
> > -    LateParsedAttrs.clear();
> >
> >      // Handle the initializer.
> >      if (HasInClassInit != ICIS_NoInit &&
> >          DeclaratorInfo.getDeclSpec().getStorageClassSpec() !=
> >          DeclSpec::SCS_static) {
> >        // The initializer was deferred; parse it and cache the tokens.
> > -      Diag(Tok, getLangOpts().CPlusPlus11 ?
> > -           diag::warn_cxx98_compat_nonstatic_member_init :
> > -           diag::ext_nonstatic_member_init);
> > +      Diag(Tok, getLangOpts().CPlusPlus11
> > +                    ? diag::warn_cxx98_compat_nonstatic_member_init
> > +                    : diag::ext_nonstatic_member_init);
> >
> >        if (DeclaratorInfo.isArrayOfUnknownBound()) {
> >          // C++11 [dcl.array]p3: An array bound may also be omitted when
> the
> > @@ -2293,37 +2286,45 @@ void Parser::ParseCXXClassMemberDeclarat
> >          // initializer in the grammar, so this is ill-formed.
> >          Diag(Tok, diag::err_incomplete_array_member_init);
> >          SkipUntil(tok::comma, true, true);
> > +
> > +        // Avoid later warnings about a class member of incomplete type.
> >          if (ThisDecl)
> > -          // Avoid later warnings about a class member of incomplete
> type.
> >            ThisDecl->setInvalidDecl();
> >        } else
> >          ParseCXXNonStaticMemberInitializer(ThisDecl);
> >      } else if (HasInitializer) {
> >        // Normal initializer.
> >        if (!Init.isUsable())
> > -        Init = ParseCXXMemberInitializer(ThisDecl,
> > -                 DeclaratorInfo.isDeclarationOfFunction(), EqualLoc);
> > -
> > +        Init = ParseCXXMemberInitializer(
> > +            ThisDecl, DeclaratorInfo.isDeclarationOfFunction(),
> EqualLoc);
> > +
> >        if (Init.isInvalid())
> >          SkipUntil(tok::comma, true, true);
> >        else if (ThisDecl)
> >          Actions.AddInitializerToDecl(ThisDecl, Init.get(),
> EqualLoc.isInvalid(),
> >                                       DS.containsPlaceholderType());
> > -    } else if (ThisDecl && DS.getStorageClassSpec() ==
> DeclSpec::SCS_static) {
> > +    } else if (ThisDecl && DS.getStorageClassSpec() ==
> DeclSpec::SCS_static)
> >        // No initializer.
> >        Actions.ActOnUninitializedDecl(ThisDecl,
> DS.containsPlaceholderType());
> > -    }
> > -
> > +
> >      if (ThisDecl) {
> > +      if (!ThisDecl->isInvalidDecl()) {
> > +        // Set the Decl for any late parsed attributes
> > +        for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni;
> ++i)
> > +          CommonLateParsedAttrs[i]->addDecl(ThisDecl);
> > +
> > +        for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i)
> > +          LateParsedAttrs[i]->addDecl(ThisDecl);
> > +      }
> >        Actions.FinalizeDeclaration(ThisDecl);
> >        DeclsInGroup.push_back(ThisDecl);
> > +
> > +      if (DeclaratorInfo.isFunctionDeclarator() &&
> > +          DeclaratorInfo.getDeclSpec().getStorageClassSpec() !=
> > +              DeclSpec::SCS_typedef)
> > +        HandleMemberFunctionDeclDelays(DeclaratorInfo, ThisDecl);
> >      }
> > -
> > -    if (ThisDecl && DeclaratorInfo.isFunctionDeclarator() &&
> > -        DeclaratorInfo.getDeclSpec().getStorageClassSpec()
> > -          != DeclSpec::SCS_typedef) {
> > -      HandleMemberFunctionDeclDelays(DeclaratorInfo, ThisDecl);
> > -    }
> > +    LateParsedAttrs.clear();
> >
> >      DeclaratorInfo.complete(ThisDecl);
> >
> >
> > Modified: cfe/trunk/test/Parser/cxx-attributes.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-attributes.cpp?rev=187557&r1=187556&r2=187557&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/Parser/cxx-attributes.cpp (original)
> > +++ cfe/trunk/test/Parser/cxx-attributes.cpp Wed Jul 31 23:22:55 2013
> > @@ -1,5 +1,4 @@
> >  // RUN: %clang_cc1 -fsyntax-only -verify %s
> > -// expected-no-diagnostics
> >
> >  class c {
> >    virtual void f1(const char* a, ...)
> > @@ -8,3 +7,7 @@ class c {
> >      __attribute__ (( __format__(__printf__,2,3) )) {}
> >  };
> >
> > +template <typename T> class X {
> > +  template <typename S> void X<S>::f()
> __attribute__((locks_excluded())); // expected-error{{nested name specifier
> 'X<S>::' for declaration does not refer into a class, class template or
> class template partial specialization}} \
> > +
>    // expected-warning{{attribute locks_excluded ignored, because it is not
> attached to a declaration}}
> > +};
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130801/541769b5/attachment.html>


More information about the cfe-commits mailing list