]> granicus.if.org Git - clang/commitdiff
Require commas to separate multiple GNU-style attributes in the same attribute list.
authorAaron Ballman <aaron@aaronballman.com>
Tue, 18 Jun 2019 12:57:05 +0000 (12:57 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Tue, 18 Jun 2019 12:57:05 +0000 (12:57 +0000)
Fixes PR38352.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363676 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseDecl.cpp
test/Parser/attributes.c

index 2c9045d74ad9d2712ba433bdc55c48fb2288cdab..0b57c8ab66345be54394c0572030acdc62a7273d 100644 (file)
@@ -164,10 +164,10 @@ void Parser::ParseGNUAttributes(ParsedAttributes &attrs,
       return;
     }
     // Parse the attribute-list. e.g. __attribute__(( weak, alias("__f") ))
-    while (true) {
-      // Allow empty/non-empty attributes. ((__vector_size__(16),,,,))
-      if (TryConsumeToken(tok::comma))
-        continue;
+    do {
+      // Eat preceeding commas to allow __attribute__((,,,foo))
+      while (TryConsumeToken(tok::comma))
+        ;
 
       // Expect an identifier or declaration specifier (const, int, etc.)
       if (Tok.isAnnotation())
@@ -212,7 +212,7 @@ void Parser::ParseGNUAttributes(ParsedAttributes &attrs,
       Eof.startToken();
       Eof.setLocation(Tok.getLocation());
       LA->Toks.push_back(Eof);
-    }
+    } while (Tok.is(tok::comma));
 
     if (ExpectAndConsume(tok::r_paren))
       SkipUntil(tok::r_paren, StopAtSemi);
index b815b8da3dc6e84f8035b6ae53fbfca83b1724ae..26ece79ddcd2ab36c3cb67d37000301b75ed15db 100644 (file)
@@ -59,8 +59,8 @@ void __attribute__((returns_twice)) returns_twice_test();
 
 int aligned(int);
 int __attribute__((vec_type_hint(char, aligned(16) )) missing_rparen_1; // expected-error 2{{expected ')'}} expected-note {{to match}} expected-warning {{does not declare anything}}
-int __attribute__((mode(x aligned(16) )) missing_rparen_2; // expected-error {{expected ')'}}
-int __attribute__((format(printf, 0 aligned(16) )) missing_rparen_3; // expected-error {{expected ')'}}
+int __attribute__((mode(x aligned(16) )) missing_rparen_2; // expected-error 2{{expected ')'}}
+int __attribute__((format(printf, 0 aligned(16) )) missing_rparen_3; // expected-error 2{{expected ')'}}
 
 
 
@@ -105,3 +105,11 @@ struct s {
 // specifier.
 struct s
 __attribute__((used)) bar;
+
+// Ensure that attributes must be separated by a comma (PR38352).
+__attribute__((const const)) int PR38352(void); // expected-error {{expected ')'}}
+// Also ensure that we accept spurious commas.
+__attribute__((,,,const)) int PR38352_1(void);
+__attribute__((const,,,)) int PR38352_2(void);
+__attribute__((const,,,const)) int PR38352_3(void);
+__attribute__((,,,const,,,const,,,)) int PR38352_4(void);