blob: 26f283a1a4fa6d0d345425a564941f5b1e19e53f [file] [log] [blame]
Daniel Dunbar8fbe78f2009-12-15 20:14:24 +00001// RUN: %clang_cc1 %s -verify -fsyntax-only
Anders Carlsson12beab72009-01-31 19:07:49 +00002
3void c1(int *a);
4
Aaron Ballmanc12aaff2013-09-11 01:37:41 +00005extern 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}}
Anders Carlsson12beab72009-01-31 19:07:49 +00008
9void t1()
10{
Aaron Ballmanb7243382013-07-23 19:30:11 +000011 int v1 __attribute((cleanup)); // expected-error {{'cleanup' attribute takes one argument}}
12 int v2 __attribute((cleanup(1, 2))); // expected-error {{'cleanup' attribute takes one argument}}
13
Aaron Ballmanc12aaff2013-09-11 01:37:41 +000014 static int v3 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
Aaron Ballmanb7243382013-07-23 19:30:11 +000015
Aaron Ballmanc12aaff2013-09-11 01:37:41 +000016 int v4 __attribute((cleanup(h))); // expected-error {{use of undeclared identifier 'h'}}
Anders Carlsson12beab72009-01-31 19:07:49 +000017
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();
Anders Carlsson723f55d2009-02-07 23:16:50 +000027void c3(struct s a);
Anders Carlsson12beab72009-01-31 19:07:49 +000028
29void t2()
30{
31 int v1 __attribute__((cleanup(c2))); // expected-error {{'cleanup' function 'c2' must take 1 parameter}}
Anders Carlssonf2f2e7f2009-02-25 17:19:08 +000032 int v2 __attribute__((cleanup(c3))); // expected-error {{'cleanup' function 'c3' parameter has type 'struct s' which is incompatible with type 'int *'}}
Anders Carlsson723f55d2009-02-07 23:16:50 +000033}
Eli Friedmanbd0e6732009-04-26 01:30:08 +000034
35// This is a manufactured testcase, but gcc accepts it...
36void c4(_Bool a);
37void t4() {
38 __attribute((cleanup(c4))) void* g;
39}
40
Ted Kremenekb79ee572013-12-18 23:30:06 +000041void c5(void*) __attribute__((deprecated)); // expected-note{{'c5' has been explicitly marked deprecated here}}
Nick Lewyckya096b142013-02-12 08:08:54 +000042void t5() {
43 int i __attribute__((cleanup(c5))); // expected-warning {{'c5' is deprecated}}
44}
Aaron Ballmanc12aaff2013-09-11 01:37:41 +000045
46void t6(void) {
47 int i __attribute__((cleanup((void *)0))); // expected-error {{'cleanup' argument is not a function}}
48}