1// RUN: %clang_cc1 %s -verify -fsyntax-only 2 3void c1(int *a); 4 5extern int g1 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}} 6int g2 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}} 7static int g3 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}} 8 9void t1() 10{ 11 int v1 __attribute((cleanup)); // expected-error {{attribute takes one argument}} 12 int v2 __attribute((cleanup(1, 2))); // expected-error {{attribute takes one argument}} 13 14 static int v3 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}} 15 16 int v4 __attribute((cleanup(h))); // expected-error {{'cleanup' argument 'h' not found}} 17 18 int v5 __attribute((cleanup(c1))); 19 int v6 __attribute((cleanup(v3))); // expected-error {{'cleanup' argument 'v3' is not a function}} 20} 21 22struct s { 23 int a, b; 24}; 25 26void c2(); 27void c3(struct s a); 28 29void t2() 30{ 31 int v1 __attribute__((cleanup(c2))); // expected-error {{'cleanup' function 'c2' must take 1 parameter}} 32 int v2 __attribute__((cleanup(c3))); // expected-error {{'cleanup' function 'c3' parameter has type 'struct s' which is incompatible with type 'int *'}} 33} 34 35// This is a manufactured testcase, but gcc accepts it... 36void c4(_Bool a); 37void t4() { 38 __attribute((cleanup(c4))) void* g; 39} 40 41