Uniformed parsing of GNU attributes at line beginnning and added GNU attributes parsing FIXMEs.

llvm-svn: 215814
This commit is contained in:
Abramo Bagnara 2014-08-16 08:29:27 +00:00
parent ae050bb057
commit 152eb39cc6
3 changed files with 31 additions and 0 deletions

View File

@ -1068,6 +1068,9 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) {
case tok::kw___declspec: // struct foo {...} __declspec(...)
case tok::l_square: // void f(struct f [ 3])
case tok::ellipsis: // void f(struct f ... [Ns])
// FIXME: we should emit semantic diagnostic when declaration
// attribute is in type attribute position.
case tok::kw___attribute: // struct foo __attribute__((used)) x;
return true;
case tok::colon:
return CouldBeBitfield; // enum E { ... } : 2;

View File

@ -95,3 +95,13 @@ void testFundef5() __attribute__(()) { }
__attribute__((pure)) int testFundef6(int a) { return a; }
void deprecatedTestFun(void) __attribute__((deprecated()));
struct s {
int a;
};
// This test ensure compatibility with parsing GNU-style attributes
// where the attribute is on a separate line from the elaborated type
// specifier.
struct s
__attribute__((used)) bar;

View File

@ -0,0 +1,18 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// expected-no-diagnostics
struct s {};
// FIXME: should warn that declaration attribute in type position is
// being applied to the declaration instead?
struct s __attribute__((used)) foo;
// FIXME: Should warn that type attribute in declaration position is
// being applied to the type instead?
struct s *bar __attribute__((address_space(1)));
// Should not warn because type attribute is in type position.
struct s *__attribute__((address_space(1))) baz;
// Should not warn because declaration attribute is in declaration position.
struct s *quux __attribute__((used));