attr-cleanup.c revision a5728872c7702ddd09537c95bc3cbd20e1f2fb09
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 %s -verify -fsyntax-only
2b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
3b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonvoid c1(int *a);
4b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
5b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonextern int g1 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}}
6b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonint g2 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}}
7b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonstatic int g3 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}}
8b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
9b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlssonvoid t1()
10b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson{
11b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    int v1 __attribute((cleanup)); // expected-error {{attribute requires 1 argument(s)}}
12b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    int v2 __attribute((cleanup(1, 2))); // expected-error {{attribute requires 1 argument(s)}}
13b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
14b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    static int v3 __attribute((cleanup(c1))); // expected-warning {{cleanup attribute ignored}}
15b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson
16b95907d6b65ac759ac8ccd6be4f2a1f3eb389e87Anders Carlsson    int v4 __attribute((cleanup(h))); // expected-error {{'cleanup' argument 'h' not found}}
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
41