1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 %s -verify -fsyntax-only
2b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
3b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonvoid c1(int *a);
4b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
5ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballmanextern int g1 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
6ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballmanint g2 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
7ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballmanstatic int g3 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
8b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
9b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonvoid t1()
10b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson{
11baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman    int v1 __attribute((cleanup)); // expected-error {{'cleanup' attribute takes one argument}}
12baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman    int v2 __attribute((cleanup(1, 2))); // expected-error {{'cleanup' attribute takes one argument}}
13baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman
14ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballman    static int v3 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
15baec77865b3ce64bb942dddc5dc2fada84ce5099Aaron Ballman
16ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballman    int v4 __attribute((cleanup(h))); // expected-error {{use of undeclared identifier 'h'}}
17b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
18b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    int v5 __attribute((cleanup(c1)));
19b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    int v6 __attribute((cleanup(v3))); // expected-error {{'cleanup' argument 'v3' is not a function}}
20b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson}
21b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
22b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonstruct s {
23b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    int a, b;
24b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson};
25b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
26b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonvoid c2();
2789941c1c68d8e4eec3c8ea8ee68e34d9e3c7b083Anders Carlssonvoid c3(struct s a);
28b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
29b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonvoid t2()
30b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson{
31b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    int v1 __attribute__((cleanup(c2))); // expected-error {{'cleanup' function 'c2' must take 1 parameter}}
32b90052a8cc4745126f7bb2e6573f07e22f24b840Anders Carlsson    int v2 __attribute__((cleanup(c3))); // expected-error {{'cleanup' function 'c3' parameter has type 'struct s' which is incompatible with type 'int *'}}
3389941c1c68d8e4eec3c8ea8ee68e34d9e3c7b083Anders Carlsson}
34d5e3e8ec50d6ea481b3bc841dcbe853175d05122Eli Friedman
35d5e3e8ec50d6ea481b3bc841dcbe853175d05122Eli Friedman// This is a manufactured testcase, but gcc accepts it...
36d5e3e8ec50d6ea481b3bc841dcbe853175d05122Eli Friedmanvoid c4(_Bool a);
37d5e3e8ec50d6ea481b3bc841dcbe853175d05122Eli Friedmanvoid t4() {
38d5e3e8ec50d6ea481b3bc841dcbe853175d05122Eli Friedman  __attribute((cleanup(c4))) void* g;
39d5e3e8ec50d6ea481b3bc841dcbe853175d05122Eli Friedman}
40d5e3e8ec50d6ea481b3bc841dcbe853175d05122Eli Friedman
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid c5(void*) __attribute__((deprecated));  // expected-note{{'c5' has been explicitly marked deprecated here}}
423c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewyckyvoid t5() {
433c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky  int i __attribute__((cleanup(c5)));  // expected-warning {{'c5' is deprecated}}
443c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky}
45ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballman
46ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballmanvoid t6(void) {
47ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballman  int i __attribute__((cleanup((void *)0)));  // expected-error {{'cleanup' argument is not a function}}
48ebaee6b74e56f28c088225b11a512e6e7d1fb9d8Aaron Ballman}
49