1 | // RUN: %clang_cc1 -fsyntax-only %s -verify |
2 | #ifndef __has_warning |
3 | #error Should have __has_warning |
4 | #endif |
5 | |
6 | #if __has_warning("not valid") // expected-warning {{__has_warning expected option name}} |
7 | #endif |
8 | |
9 | // expected-warning@+2 {{Should have -Wparentheses}} |
10 | #if __has_warning("-Wparentheses") |
11 | #warning Should have -Wparentheses |
12 | #endif |
13 | |
14 | // expected-error@+2 {{expected string literal in '__has_warning'}} |
15 | // expected-error@+1 {{missing ')'}} expected-note@+1 {{match}} |
16 | #if __has_warning(-Wfoo) |
17 | #endif |
18 | |
19 | // expected-warning@+3 {{Not a valid warning flag}} |
20 | #if __has_warning("-Wnot-a-valid-warning-flag-at-all") |
21 | #else |
22 | #warning Not a valid warning flag |
23 | #endif |
24 | |
25 | // expected-error@+1 {{missing '(' after '__has_warning'}} |
26 | #if __has_warning "not valid" |
27 | #endif |
28 | |
29 | // Macro expansion does not occur in the parameter to __has_warning |
30 | // (as is also expected behaviour for ordinary macros), so the |
31 | // following should not expand: |
32 | |
33 | #define MY_ALIAS "-Wparentheses" |
34 | |
35 | // expected-error@+1 {{expected}} |
36 | #if __has_warning(MY_ALIAS) |
37 | #error Alias expansion not allowed |
38 | #endif |
39 | |
40 | // But deferring should expand: |
41 | #define HAS_WARNING(X) __has_warning(X) |
42 | |
43 | #if !HAS_WARNING(MY_ALIAS) |
44 | #error Expansion should have occurred |
45 | #endif |
46 | |