|  | // RUN: %clang_cc1 -ffreestanding -Eonly -verify %s | 
|  |  | 
|  | // Try different path permutations of __has_include with existing file. | 
|  | #if __has_include("stdint.h") | 
|  | #else | 
|  | #error "__has_include failed (1)." | 
|  | #endif | 
|  |  | 
|  | #if __has_include(<stdint.h>) | 
|  | #else | 
|  | #error "__has_include failed (2)." | 
|  | #endif | 
|  |  | 
|  | // Try unary expression. | 
|  | #if !__has_include("stdint.h") | 
|  | #error "__has_include failed (5)." | 
|  | #endif | 
|  |  | 
|  | // Try binary expression. | 
|  | #if __has_include("stdint.h") && __has_include("stddef.h") | 
|  | #else | 
|  | #error "__has_include failed (6)." | 
|  | #endif | 
|  |  | 
|  | // Try non-existing file. | 
|  | #if __has_include("blahblah.h") | 
|  | #error "__has_include failed (7)." | 
|  | #endif | 
|  |  | 
|  | // Try defined. | 
|  | #if !defined(__has_include) | 
|  | #error "defined(__has_include) failed (8)." | 
|  | #endif | 
|  |  | 
|  | // Try different path permutations of __has_include_next with existing file. | 
|  | #if __has_include_next("stddef.h") // expected-warning {{#include_next in primary source file}} | 
|  | #else | 
|  | #error "__has_include failed (1)." | 
|  | #endif | 
|  |  | 
|  | #if __has_include_next(<stddef.h>) // expected-warning {{#include_next in primary source file}} | 
|  | #else | 
|  | #error "__has_include failed (2)." | 
|  | #endif | 
|  |  | 
|  | // Try unary expression. | 
|  | #if !__has_include_next("stdint.h") // expected-warning {{#include_next in primary source file}} | 
|  | #error "__has_include_next failed (5)." | 
|  | #endif | 
|  |  | 
|  | // Try binary expression. | 
|  | #if __has_include_next("stdint.h") && __has_include("stddef.h") // expected-warning {{#include_next in primary source file}} | 
|  | #else | 
|  | #error "__has_include_next failed (6)." | 
|  | #endif | 
|  |  | 
|  | // Try non-existing file. | 
|  | #if __has_include_next("blahblah.h") // expected-warning {{#include_next in primary source file}} | 
|  | #error "__has_include_next failed (7)." | 
|  | #endif | 
|  |  | 
|  | // Try defined. | 
|  | #if !defined(__has_include_next) | 
|  | #error "defined(__has_include_next) failed (8)." | 
|  | #endif | 
|  |  | 
|  | // Fun with macros | 
|  | #define MACRO1 __has_include(<stdint.h>) | 
|  | #define MACRO2 ("stdint.h") | 
|  | #define MACRO3 ("blahblah.h") | 
|  | #define MACRO4 blahblah.h>) | 
|  | #define MACRO5 <stdint.h> | 
|  |  | 
|  | #if !MACRO1 | 
|  | #error "__has_include with macro failed (1)." | 
|  | #endif | 
|  |  | 
|  | #if !__has_include MACRO2 | 
|  | #error "__has_include with macro failed (2)." | 
|  | #endif | 
|  |  | 
|  | #if __has_include MACRO3 | 
|  | #error "__has_include with macro failed (3)." | 
|  | #endif | 
|  |  | 
|  | #if __has_include(<MACRO4 | 
|  | #error "__has_include with macro failed (4)." | 
|  | #endif | 
|  |  | 
|  | #if !__has_include(MACRO5) | 
|  | #error "__has_include with macro failed (2)." | 
|  | #endif | 
|  |  | 
|  | // Try as non-preprocessor directives | 
|  | void foo( void ) { | 
|  | __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}} | 
|  | __has_include("stdint.h")  // expected-error {{__has_include must be used within a preprocessing directive}} | 
|  | } | 
|  |  | 
|  | MACRO1  // expected-error {{__has_include must be used within a preprocessing directive}} | 
|  |  | 
|  | #if 1 | 
|  | MACRO1  // expected-error {{__has_include must be used within a preprocessing directive}} | 
|  | #endif | 
|  |  | 
|  | #if 0 | 
|  | #elif 1 | 
|  | MACRO1  // expected-error {{__has_include must be used within a preprocessing directive}} | 
|  | #endif | 
|  |  | 
|  | #if 0 | 
|  | MACRO1  // This should be fine because it is never actually reached | 
|  | #endif | 
|  |  | 
|  |  | 
|  | // Try badly formed expressions. | 
|  | // FIXME: We can recover better in almost all of these cases. (PR13335) | 
|  |  | 
|  | // expected-error@+1 {{missing '(' after '__has_include'}} | 
|  | #if __has_include "stdint.h") | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} expected-error@+1 {{token is not a valid binary operator in a preprocessor subexpression}} | 
|  | #if __has_include(stdint.h) | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} | 
|  | #if __has_include() | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{missing '(' after '__has_include'}} | 
|  | #if __has_include) | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{missing '(' after '__has_include'}} | 
|  | #if __has_include<stdint.h>) | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} expected-warning@+1 {{missing terminating '"' character}}  expected-error@+1 {{invalid token at start of a preprocessor expression}} | 
|  | #if __has_include("stdint.h) | 
|  | #endif | 
|  |  | 
|  | // 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}} | 
|  | #if __has_include(stdint.h") | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} expected-error@+1 {{token is not a valid binary operator in a preprocessor subexpression}} | 
|  | #if __has_include(stdint.h>) | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{__has_include must be used within a preprocessing directive}} | 
|  | __has_include | 
|  |  | 
|  | // expected-error@+1 {{missing ')' after '__has_include'}} // expected-error@+1 {{expected value in expression}}  // expected-note@+1 {{to match this '('}} | 
|  | #if __has_include("stdint.h" | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} // expected-error@+1 {{expected value in expression}} | 
|  | #if __has_include( | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{missing '(' after '__has_include'}} // expected-error@+1 {{expected value in expression}} | 
|  | #if __has_include | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{missing '(' after '__has_include'}} | 
|  | #if __has_include'x' | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} | 
|  | #if __has_include('x' | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME}} expected-error@+1 {{expected end of line in preprocessor expression}} | 
|  | #if __has_include('x') | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{missing ')' after '__has_include'}}  // expected-error@+1 {{expected value in expression}}  // expected-note@+1 {{to match this '('}} | 
|  | #if __has_include(<stdint.h> | 
|  | #endif | 
|  |  | 
|  | // expected-error@+1 {{expected "FILENAME" or <FILENAME>}} // expected-error@+1 {{expected value in expression}} | 
|  | #if __has_include(<stdint.h) | 
|  | #endif | 
|  |  | 
|  | #define HAS_INCLUDE(header) __has_include(header) | 
|  | #if HAS_INCLUDE(<stdint.h>) | 
|  | #else | 
|  | #error "__has_include failed (9)." | 
|  | #endif | 
|  |  | 
|  | #if FOO | 
|  | #elif __has_include(<foo>) | 
|  | #endif | 
|  |  | 
|  | // PR15539 | 
|  | #ifdef FOO | 
|  | #elif __has_include(<foo>) | 
|  | #endif |