attr-cleanup.c revision d5e3e8ec50d6ea481b3bc841dcbe853175d05122
1d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar// RUN: clang-cc %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