1 | // RUN: %clang_cc1 -ffreestanding -Eonly -verify %s |
2 | |
3 | // Try different path permutations of __has_include with existing file. |
4 | #if __has_include("stdint.h") |
5 | #else |
6 | #error "__has_include failed (1)." |
7 | #endif |
8 | |
9 | #if __has_include(<stdint.h>) |
10 | #else |
11 | #error "__has_include failed (2)." |
12 | #endif |
13 | |
14 | // Try unary expression. |
15 | #if !__has_include("stdint.h") |
16 | #error "__has_include failed (5)." |
17 | #endif |
18 | |
19 | // Try binary expression. |
20 | #if __has_include("stdint.h") && __has_include("stddef.h") |
21 | #else |
22 | #error "__has_include failed (6)." |
23 | #endif |
24 | |
25 | // Try non-existing file. |
26 | #if __has_include("blahblah.h") |
27 | #error "__has_include failed (7)." |
28 | #endif |
29 | |
30 | // Try defined. |
31 | #if !defined(__has_include) |
32 | #error "defined(__has_include) failed (8)." |
33 | #endif |
34 | |
35 | // Try different path permutations of __has_include_next with existing file. |
36 | #if __has_include_next("stddef.h") // expected-warning {{#include_next in primary source file}} |
37 | #else |
38 | #error "__has_include failed (1)." |
39 | #endif |
40 | |
41 | #if __has_include_next(<stddef.h>) // expected-warning {{#include_next in primary source file}} |
42 | #else |
43 | #error "__has_include failed (2)." |
44 | #endif |
45 | |
46 | // Try unary expression. |
47 | #if !__has_include_next("stdint.h") // expected-warning {{#include_next in primary source file}} |
48 | #error "__has_include_next failed (5)." |
49 | #endif |
50 | |
51 | // Try binary expression. |
52 | #if __has_include_next("stdint.h") && __has_include("stddef.h") // expected-warning {{#include_next in primary source file}} |
53 | #else |
54 | #error "__has_include_next failed (6)." |
55 | #endif |
56 | |
57 | // Try non-existing file. |
58 | #if __has_include_next("blahblah.h") // expected-warning {{#include_next in primary source file}} |
59 | #error "__has_include_next failed (7)." |
60 | #endif |
61 | |
62 | // Try defined. |
63 | #if !defined(__has_include_next) |
64 | #error "defined(__has_include_next) failed (8)." |
65 | #endif |
66 | |
67 | // Fun with macros |
68 | #define MACRO1 __has_include(<stdint.h>) |
69 | #define MACRO2 ("stdint.h") |
70 | #define MACRO3 ("blahblah.h") |
71 | #define MACRO4 blahblah.h>) |
72 | #define MACRO5 <stdint.h> |
73 | |
74 | #if !MACRO1 |
75 | #error "__has_include with macro failed (1)." |
76 | #endif |
77 | |
78 | #if !__has_include MACRO2 |
79 | #error "__has_include with macro failed (2)." |
80 | #endif |
81 | |
82 | #if __has_include MACRO3 |
83 | #error "__has_include with macro failed (3)." |
84 | #endif |
85 | |
86 | #if __has_include(<MACRO4 |
87 | #error "__has_include with macro failed (4)." |
88 | #endif |
89 | |
90 | #if !__has_include(MACRO5) |
91 | #error "__has_include with macro failed (2)." |
92 | #endif |
93 | |
94 | // Try as non-preprocessor directives |
95 | void foo( void ) { |
96 | __has_include_next("stdint.h") // expected-warning {{#include_next in primary source file}} expected-error {{'__has_include_next' must be used within a preprocessing directive}} |
97 | __has_include("stdint.h") // expected-error {{'__has_include' must be used within a preprocessing directive}} |
98 | } |
99 | |
100 | MACRO1 // expected-error {{'__has_include' must be used within a preprocessing directive}} |
101 | |
102 | #if 1 |
103 | MACRO1 // expected-error {{'__has_include' must be used within a preprocessing directive}} |
104 | #endif |
105 | |
106 | #if 0 |
107 | #elif 1 |
108 | MACRO1 // expected-error {{'__has_include' must be used within a preprocessing directive}} |
109 | #endif |
110 | |
111 | #if 0 |
112 | MACRO1 // This should be fine because it is never actually reached |
113 | #endif |
114 | |
115 | |
116 | // Try badly formed expressions. |
117 | // FIXME: We can recover better in almost all of these cases. (PR13335) |
118 | |
119 | // expected-error@+1 {{missing '(' after '__has_include'}} |
120 | #if __has_include "stdint.h") |
121 | #endif |
122 | |
123 | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} expected-error@+1 {{token is not a valid binary operator in a preprocessor subexpression}} |
124 | #if __has_include(stdint.h) |
125 | #endif |
126 | |
127 | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} |
128 | #if __has_include() |
129 | #endif |
130 | |
131 | // expected-error@+1 {{missing '(' after '__has_include'}} |
132 | #if __has_include) |
133 | #endif |
134 | |
135 | // expected-error@+1 {{missing '(' after '__has_include'}} |
136 | #if __has_include<stdint.h>) |
137 | #endif |
138 | |
139 | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} expected-warning@+1 {{missing terminating '"' character}} expected-error@+1 {{invalid token at start of a preprocessor expression}} |
140 | #if __has_include("stdint.h) |
141 | #endif |
142 | |
143 | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} expected-warning@+1 {{missing terminating '"' character}} expected-error@+1 {{token is not a valid binary operator in a preprocessor subexpression}} |
144 | #if __has_include(stdint.h") |
145 | #endif |
146 | |
147 | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} expected-error@+1 {{token is not a valid binary operator in a preprocessor subexpression}} |
148 | #if __has_include(stdint.h>) |
149 | #endif |
150 | |
151 | // expected-error@+1 {{'__has_include' must be used within a preprocessing directive}} |
152 | __has_include |
153 | |
154 | // expected-error@+1 {{missing ')' after '__has_include'}} // expected-error@+1 {{expected value in expression}} // expected-note@+1 {{to match this '('}} |
155 | #if __has_include("stdint.h" |
156 | #endif |
157 | |
158 | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} // expected-error@+1 {{expected value in expression}} |
159 | #if __has_include( |
160 | #endif |
161 | |
162 | // expected-error@+1 {{missing '(' after '__has_include'}} // expected-error@+1 {{expected value in expression}} |
163 | #if __has_include |
164 | #endif |
165 | |
166 | // expected-error@+1 {{missing '(' after '__has_include'}} |
167 | #if __has_include'x' |
168 | #endif |
169 | |
170 | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} |
171 | #if __has_include('x' |
172 | #endif |
173 | |
174 | // expected-error@+1 {{expected "FILENAME" or <FILENAME}} expected-error@+1 {{expected end of line in preprocessor expression}} |
175 | #if __has_include('x') |
176 | #endif |
177 | |
178 | // expected-error@+1 {{missing ')' after '__has_include'}} // expected-error@+1 {{expected value in expression}} // expected-note@+1 {{to match this '('}} |
179 | #if __has_include(<stdint.h> |
180 | #endif |
181 | |
182 | // expected-error@+1 {{expected '>'}} expected-note@+1 {{to match this '<'}} // expected-error@+1 {{expected value in expression}} |
183 | #if __has_include(<stdint.h) |
184 | #endif |
185 | |
186 | #define HAS_INCLUDE(header) __has_include(header) |
187 | #if HAS_INCLUDE(<stdint.h>) |
188 | #else |
189 | #error "__has_include failed (9)." |
190 | #endif |
191 | |
192 | #if FOO |
193 | #elif __has_include(<foo>) |
194 | #endif |
195 | |
196 | // PR15539 |
197 | #ifdef FOO |
198 | #elif __has_include(<foo>) |
199 | #endif |
200 | |