| // RUN: %clang_cc1 %s -verify -fsyntax-only | |
| void c1(int *a); | |
| extern int g1 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute only applies to local variables}} | |
| int g2 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute only applies to local variables}} | |
| static int g3 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute only applies to local variables}} | |
| void t1() | |
| { | |
| int v1 __attribute((cleanup)); // expected-error {{'cleanup' attribute takes one argument}} | |
| int v2 __attribute((cleanup(1, 2))); // expected-error {{'cleanup' attribute takes one argument}} | |
| static int v3 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute only applies to local variables}} | |
| int v4 __attribute((cleanup(h))); // expected-error {{use of undeclared identifier 'h'}} | |
| int v5 __attribute((cleanup(c1))); | |
| int v6 __attribute((cleanup(v3))); // expected-error {{'cleanup' argument 'v3' is not a function}} | |
| } | |
| struct s { | |
| int a, b; | |
| }; | |
| void c2(); | |
| void c3(struct s a); | |
| void t2() | |
| { | |
| int v1 __attribute__((cleanup(c2))); // expected-error {{'cleanup' function 'c2' must take 1 parameter}} | |
| int v2 __attribute__((cleanup(c3))); // expected-error {{'cleanup' function 'c3' parameter has type 'struct s' which is incompatible with type 'int *'}} | |
| } | |
| // This is a manufactured testcase, but gcc accepts it... | |
| void c4(_Bool a); | |
| void t4() { | |
| __attribute((cleanup(c4))) void* g; | |
| } | |
| void c5(void*) __attribute__((deprecated)); // expected-note{{'c5' has been explicitly marked deprecated here}} | |
| void t5() { | |
| int i __attribute__((cleanup(c5))); // expected-warning {{'c5' is deprecated}} | |
| } | |
| void t6(void) { | |
| int i __attribute__((cleanup((void *)0))); // expected-error {{'cleanup' argument is not a function}} | |
| } | |
| void t7(__attribute__((cleanup(c4))) int a) {} // expected-warning {{'cleanup' attribute only applies to local variables}} |