aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseTentative.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2008-10-05 14:27:18 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2008-10-05 14:27:18 +0000
commit1ee2c43bc0c281b60b29f1883e1e206cae28aed6 (patch)
tree6f400127532f951216aedfadfce7642224d08b1d /lib/Parse/ParseTentative.cpp
parentc1d1bbf691819dc69c122cbdd376c5c630bae378 (diff)
Consider GNU attributes when doing ambiguity resolution.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57108 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseTentative.cpp')
-rw-r--r--lib/Parse/ParseTentative.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/Parse/ParseTentative.cpp b/lib/Parse/ParseTentative.cpp
index 414f1f51f7..5e4888f699 100644
--- a/lib/Parse/ParseTentative.cpp
+++ b/lib/Parse/ParseTentative.cpp
@@ -164,12 +164,13 @@ Parser::TentativeParsingResult Parser::TryParseSimpleDeclaration() {
return TPR_ambiguous;
}
-/// init-declarator-list:
-/// init-declarator
-/// init-declarator-list ',' init-declarator
+/// init-declarator-list:
+/// init-declarator
+/// init-declarator-list ',' init-declarator
///
-/// init-declarator:
-/// declarator initializer[opt]
+/// init-declarator:
+/// declarator initializer[opt]
+/// [GNU] declarator simple-asm-expr[opt] attributes[opt] initializer[opt]
///
/// initializer:
/// '=' initializer-clause
@@ -195,6 +196,10 @@ Parser::TentativeParsingResult Parser::TryParseInitDeclaratorList() {
if (TPR != TPR_ambiguous)
return TPR;
+ // [GNU] simple-asm-expr[opt] attributes[opt]
+ if (Tok.is(tok::kw_asm) || Tok.is(tok::kw___attribute))
+ return TPR_true;
+
// initializer[opt]
if (Tok.is(tok::l_paren)) {
// Parse through the parens.
@@ -230,6 +235,7 @@ Parser::TentativeParsingResult Parser::TryParseInitDeclaratorList() {
/// cv-qualifier-seq[opt] exception-specification[opt]
/// direct-declarator '[' constant-expression[opt] ']'
/// '(' declarator ')'
+/// [GNU] '(' attributes declarator ')'
///
/// abstract-declarator:
/// ptr-operator abstract-declarator[opt]
@@ -302,8 +308,11 @@ Parser::TentativeParsingResult Parser::TryParseDeclarator(bool mayBeAbstract) {
return TPR;
} else {
// '(' declarator ')'
+ // '(' attributes declarator ')'
// '(' abstract-declarator ')'
- ConsumeParen();
+ ConsumeParen();
+ if (Tok.is(tok::kw___attribute))
+ return TPR_true; // attributes indicate declaration
TentativeParsingResult TPR = TryParseDeclarator(mayBeAbstract);
if (TPR != TPR_ambiguous)
return TPR;