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 95void 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 100MACRO1 // expected-error {{__has_include must be used within a preprocessing directive}} 101 102#if 1 103MACRO1 // expected-error {{__has_include must be used within a preprocessing directive}} 104#endif 105 106#if 0 107#elif 1 108MACRO1 // expected-error {{__has_include must be used within a preprocessing directive}} 109#endif 110 111#if 0 112MACRO1 // 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 "FILENAME" or <FILENAME>}} // 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