| 1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
| 2 | // rdar: //6734520 |
| 3 | |
| 4 | void tooManyArgs() __attribute__((unavailable("a", "b"))); // expected-error {{'unavailable' attribute takes no more than 1 argument}} |
| 5 | |
| 6 | int foo(int) __attribute__((__unavailable__("USE IFOO INSTEAD"))); // expected-note {{'foo' has been explicitly marked unavailable here}} |
| 7 | double dfoo(double) __attribute__((__unavailable__("NO LONGER"))); // expected-note 2 {{'dfoo' has been explicitly marked unavailable here}} |
| 8 | |
| 9 | void bar() __attribute__((__unavailable__)); // expected-note {{explicitly marked unavailable}} |
| 10 | |
| 11 | int quux(void) __attribute__((__unavailable__(12))); // expected-error {{'__unavailable__' attribute requires a string}} |
| 12 | |
| 13 | #define ACCEPTABLE "Use something else" |
| 14 | int quux2(void) __attribute__((__unavailable__(ACCEPTABLE))); |
| 15 | |
| 16 | void test_foo() { |
| 17 | int ir = foo(1); // expected-error {{'foo' is unavailable: USE IFOO INSTEAD}} |
| 18 | double dr = dfoo(1.0); // expected-error {{'dfoo' is unavailable: NO LONGER}} |
| 19 | |
| 20 | void (*fp)() = &bar; // expected-error {{'bar' is unavailable}} |
| 21 | |
| 22 | double (*fp4)(double) = dfoo; // expected-error {{'dfoo' is unavailable: NO LONGER}} |
| 23 | } |
| 24 | |
| 25 | char test2[__has_feature(attribute_unavailable_with_message) ? 1 : -1]; |
| 26 | |
| 27 | // rdar://9623855 |
| 28 | void unavail(void) __attribute__((__unavailable__)); |
| 29 | void unavail(void) { |
| 30 | // No complains inside an unavailable function. |
| 31 | int ir = foo(1); |
| 32 | double dr = dfoo(1.0); |
| 33 | void (*fp)() = &bar; |
| 34 | double (*fp4)(double) = dfoo; |
| 35 | } |
| 36 | |
| 37 | // rdar://10201690 |
| 38 | enum foo { |
| 39 | a = 1, |
| 40 | b __attribute__((deprecated())) = 2, // expected-note {{'b' has been explicitly marked deprecated here}} |
| 41 | c = 3 |
| 42 | }__attribute__((deprecated())); // expected-note {{'foo' has been explicitly marked deprecated here}} |
| 43 | |
| 44 | enum fee { // expected-note 2 {{'fee' has been explicitly marked unavailable here}} |
| 45 | r = 1, |
| 46 | s = 2, |
| 47 | t = 3 |
| 48 | }__attribute__((unavailable())); |
| 49 | |
| 50 | enum fee f() { // expected-error {{'fee' is unavailable}} |
| 51 | int i = a; // expected-warning {{'a' is deprecated}} |
| 52 | |
| 53 | i = b; // expected-warning {{'b' is deprecated}} |
| 54 | |
| 55 | return r; // expected-error {{'r' is unavailable}} |
| 56 | } |
| 57 | |