diff options
author | Aaron Ballman <aaron@aaronballman.com> | 2014-03-12 00:01:07 +0000 |
---|---|---|
committer | Aaron Ballman <aaron@aaronballman.com> | 2014-03-12 00:01:07 +0000 |
commit | e8d69b7fc98d612afc74bab7eda457646fc06900 (patch) | |
tree | 91c1a41107b8bb61ebaec1bddfc450992aefb461 /clang/lib/Parse/ParseExprCXX.cpp | |
parent | 5876656c5e7aff902ebbb3fdc3232262a2034a02 (diff) | |
download | bcm5719-llvm-e8d69b7fc98d612afc74bab7eda457646fc06900.tar.gz bcm5719-llvm-e8d69b7fc98d612afc74bab7eda457646fc06900.zip |
Allow GNU-style attributes on lambda expressions.
llvm-svn: 203628
Diffstat (limited to 'clang/lib/Parse/ParseExprCXX.cpp')
-rw-r--r-- | clang/lib/Parse/ParseExprCXX.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index 439fb077da2..f10ca6ab784 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -995,7 +995,6 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( ParsedAttributes Attr(AttrFactory); SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo; SourceLocation EllipsisLoc; - if (Tok.isNot(tok::r_paren)) { Actions.RecordParsingTemplateParameterDepth(TemplateParameterDepth); @@ -1009,6 +1008,10 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( SourceLocation RParenLoc = T.getCloseLocation(); DeclEndLoc = RParenLoc; + // GNU-style attributes must be parsed before the mutable specifier to be + // compatible with GCC. + MaybeParseGNUAttributes(Attr, &DeclEndLoc); + // Parse 'mutable'[opt]. SourceLocation MutableLoc; if (TryConsumeToken(tok::kw_mutable, MutableLoc)) @@ -1067,6 +1070,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( TrailingReturnType), Attr, DeclEndLoc); } else if (Tok.is(tok::kw_mutable) || Tok.is(tok::arrow) || + Tok.is(tok::kw___attribute) || (Tok.is(tok::l_square) && NextToken().is(tok::l_square))) { // It's common to forget that one needs '()' before 'mutable', an attribute // specifier, or the result type. Deal with this. @@ -1074,6 +1078,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( switch (Tok.getKind()) { case tok::kw_mutable: TokKind = 0; break; case tok::arrow: TokKind = 1; break; + case tok::kw___attribute: case tok::l_square: TokKind = 2; break; default: llvm_unreachable("Unknown token kind"); } @@ -1083,7 +1088,12 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( << FixItHint::CreateInsertion(Tok.getLocation(), "() "); SourceLocation DeclLoc = Tok.getLocation(); SourceLocation DeclEndLoc = DeclLoc; - + + // GNU-style attributes must be parsed before the mutable specifier to be + // compatible with GCC. + ParsedAttributes Attr(AttrFactory); + MaybeParseGNUAttributes(Attr, &DeclEndLoc); + // Parse 'mutable', if it's there. SourceLocation MutableLoc; if (Tok.is(tok::kw_mutable)) { @@ -1092,7 +1102,6 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( } // Parse attribute-specifier[opt]. - ParsedAttributes Attr(AttrFactory); MaybeParseCXX11Attributes(Attr, &DeclEndLoc); // Parse the return type, if there is one. |