Home | History | Annotate | Download | only in Preprocessor
      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 "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