Fix a parser bug where we let attributes interfere with our disambiguation
of whether a '(' was a grouping paren or the start of a function declarator.
This is PR2796.

Now we eat the attribute before deciding whether the paren is grouping or
not, then apply it to the resultant decl or to the first argument as needed.

One somewhat surprising aspect of this is that attributes interact with
implicit int in cases like this:

void a(x, y) // k&r style function
void b(__attribute__(()) x, y); // function with two implicit int arguments
void c(x, __attribute__(()) y); // error, can't have attr in identifier list.

Fun stuff.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57790 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Parser/attributes.c b/test/Parser/attributes.c
index 7161d6c..0746517 100644
--- a/test/Parser/attributes.c
+++ b/test/Parser/attributes.c
@@ -1,6 +1,45 @@
-// RUN: clang -fsyntax-only -verify %s -pedantic
+// RUN: clang -fsyntax-only -verify %s -pedantic -std=c99
 
-static __inline void __attribute__((__always_inline__, __nodebug__)) // expected-warning {{extension used}}
-foo (void)
-{
+int __attribute__(()) x;  // expected-warning {{extension used}}
+
+// Hide __attribute__ behind a macro, to silence extension warnings about
+// "__attribute__ being an extension".
+#define attribute __attribute__
+
+__inline void attribute((__always_inline__, __nodebug__))
+foo(void) {
 }
+
+
+attribute(()) y;   // expected-warning {{defaults to 'int'}}
+
+// PR2796
+int (attribute(()) *z)(long y);
+
+
+void f1(attribute(()) int x);
+
+int f2(y, attribute(()) x);     // expected-error {{expected identifier}}
+
+// This is parsed as a normal argument list (with two args that are implicit
+// int) because the attribute is a declspec.
+void f3(attribute(()) x,  // expected-warning {{defaults to 'int'}}
+        y);               // expected-warning {{defaults to 'int'}}
+
+void f4(attribute(()));   // expected-error {{expected parameter declarator}}
+
+
+// This is ok, the attribute applies to the pointer.
+int baz(int (attribute(()) *x)(long y));
+
+void g1(void (*f1)(attribute(()) int x));
+void g2(int (*f2)(y, attribute(()) x));    // expected-error {{expected identifier}}
+void g3(void (*f3)(attribute(()) x, int y));  // expected-warning {{defaults to 'int'}}
+void g4(void (*f4)(attribute(())));  // expected-error {{expected parameter declarator}}
+
+
+void (*h1)(void (*f1)(attribute(()) int x));
+void (*h2)(int (*f2)(y, attribute(()) x));    // expected-error {{expected identifier}}
+
+void (*h3)(void (*f3)(attribute(()) x));   // expected-warning {{defaults to 'int'}}
+void (*h4)(void (*f4)(attribute(())));  // expected-error {{expected parameter declarator}}