// Any list of specifiers and qualifiers at the start of a declaration
// may contain attribute specifiers
static __attribute__((a)) unsigned __attribute__((b)) const __attribute__((c)) int x;

// An attribute specifier list may appear immediately before a declarator
// (other than the first) in a comma-separated list of declarators in a
// declaration of more than one identifier.
// They apply only to the identifier before whose declarator they appear.

// a is applied to d0, d1, d2; b is applied to d1
__attribute__((a)) void d0(), __attribute__((b)) d1(), d2();

// An attribute specifier list may appear immediately before the comma,
// = or semicolon terminating the declaration of an identifier
int i __attribute__((a)), __attribute__((b)) foo() __attribute__((c));
int k __attribute__((a)) = 1, __attribute__((b)) * __attribute__((c)) q __attribute__((d)) = 0;

// the attribute must follow the asm specification if there is any
int g() asm("goo") __attribute__((a));

// An attribute specifier list may appear at the start of a nested declarator.
// After the * of a pointer declarator, they may be mixed with any type qualifiers

// f: pointer to pointer to attr(a) function returning void
void (__attribute__((a)) **f)(void);
// p: pointer to attr(a) pointer to void
void * __attribute__((a)) *p;
