]> granicus.if.org Git - clang/commitdiff
Consider GNU attributes when doing ambiguity resolution.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 5 Oct 2008 14:27:18 +0000 (14:27 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 5 Oct 2008 14:27:18 +0000 (14:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57108 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseTentative.cpp
test/SemaCXX/decl-expr-ambiguity.cpp

index 414f1f51f7d28cc4d3965b868db6f2857ee47653..5e4888f699058448af3116596ceeb29531ac093d 100644 (file)
@@ -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;
index b9e824dff04834a4ab2a89bb95f028f06e479cbb..48e132097e46c7d9900cbcd43a65d19c118a9d70 100644 (file)
@@ -17,4 +17,5 @@ void f() {
   T(d)[5]; // expected-warning {{statement was disambiguated as declaration}} expected-error {{redefinition of 'd'}}
   typeof(int[])(f) = { 1, 2 }; // expected-warning {{statement was disambiguated as declaration}}
   void(b)(int);
+  int(d2) __attribute__(()); // expected-warning {{statement was disambiguated as declaration}}
 }