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