From: Chris Lattner Date: Thu, 18 Dec 2008 07:02:59 +0000 (+0000) Subject: disallow attributes in a few callers of ParseTypeQualifierListOpt, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a69d1ce71579147c306f21c4cf205ef9519d63d;p=clang disallow attributes in a few callers of ParseTypeQualifierListOpt, these completely ignore parsed attributes anyway, so don't try to read them. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61198 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 579d52303c..b460fd5290 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -889,7 +889,7 @@ private: typedef void (Parser::*DirectDeclParseFunction)(Declarator&); void ParseDeclaratorInternal(Declarator &D, DirectDeclParseFunction DirectDeclParser); - void ParseTypeQualifierListOpt(DeclSpec &DS); + void ParseTypeQualifierListOpt(DeclSpec &DS, bool AllowAttributes = true); void ParseDirectDeclarator(Declarator &D); void ParseParenDeclarator(Declarator &D); void ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D, diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index e31b87bd43..bb3f647972 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1251,22 +1251,17 @@ bool Parser::isDeclarationSpecifier() { /// ParseTypeQualifierListOpt /// type-qualifier-list: [C99 6.7.5] /// type-qualifier -/// [GNU] attributes +/// [GNU] attributes [ only if AttributesAllowed=true ] /// type-qualifier-list type-qualifier -/// [GNU] type-qualifier-list attributes +/// [GNU] type-qualifier-list attributes [ only if AttributesAllowed=true ] /// -void Parser::ParseTypeQualifierListOpt(DeclSpec &DS) { +void Parser::ParseTypeQualifierListOpt(DeclSpec &DS, bool AttributesAllowed) { while (1) { int isInvalid = false; const char *PrevSpec = 0; SourceLocation Loc = Tok.getLocation(); switch (Tok.getKind()) { - default: - // If this is not a type-qualifier token, we're done reading type - // qualifiers. First verify that DeclSpec's are consistent. - DS.Finish(Diags, PP.getSourceManager(), getLang()); - return; case tok::kw_const: isInvalid = DS.SetTypeQual(DeclSpec::TQ_const , Loc, PrevSpec, getLang())*2; @@ -1280,8 +1275,16 @@ void Parser::ParseTypeQualifierListOpt(DeclSpec &DS) { getLang())*2; break; case tok::kw___attribute: - DS.AddAttributes(ParseAttributes()); - continue; // do *not* consume the next token! + if (AttributesAllowed) { + DS.AddAttributes(ParseAttributes()); + continue; // do *not* consume the next token! + } + // otherwise, FALL THROUGH! + default: + // If this is not a type-qualifier token, we're done reading type + // qualifiers. First verify that DeclSpec's are consistent. + DS.Finish(Diags, PP.getSourceManager(), getLang()); + return; } // If the specifier combination wasn't legal, issue a diagnostic. @@ -1688,7 +1691,7 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D, // cv-qualifier-seq[opt]. DeclSpec DS; if (getLang().CPlusPlus) { - ParseTypeQualifierListOpt(DS); + ParseTypeQualifierListOpt(DS, false /*no attributes*/); // Parse exception-specification[opt]. if (Tok.is(tok::kw_throw)) @@ -1845,7 +1848,7 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D, DeclSpec DS; if (getLang().CPlusPlus) { // Parse cv-qualifier-seq[opt]. - ParseTypeQualifierListOpt(DS); + ParseTypeQualifierListOpt(DS, false /*no attributes*/); // Parse exception-specification[opt]. if (Tok.is(tok::kw_throw)) @@ -1945,7 +1948,7 @@ void Parser::ParseBracketDeclarator(Declarator &D) { // If there is a type-qualifier-list, read it now. // Type qualifiers in an array subscript are a C99 feature. DeclSpec DS; - ParseTypeQualifierListOpt(DS); + ParseTypeQualifierListOpt(DS, false /*no attributes*/); // If we haven't already read 'static', check to see if there is one after the // type-qualifier-list.