1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
|
/*
* e_std.t
*
* 1998/08 made public kmatsui
* 2002/08 revised not to conflict with C99 Standard kmatsui
* 2003/11 added a few samples kmatsui
*
* Samples to test Standard C preprocessing.
* Preprocessor must diagnose all of these samples appropriately.
*/
/* e_4_3.t: Illegal pp-token. */
/* 4.3: Empty character constant is an error. */
#if '' == 0 /* This line is invalid, maybe skipped. */
#endif /* This line maybe the second error. */
/* e_7_4.t: #line error. */
/* 7.4: string literal in #line directive shall be a character string
literal. */
#line 123 L"wide"
/* 27; "e_std.t"; */
__LINE__; __FILE__;
/* Restore to correct line number. */
#line 31
/* e_12_8.t: Out of range of integer pp-token in #if expression. */
/* Note: Tests of character constant overflow are in 32.5, 33.2, 35.2. */
/* 12.8: Preprocessing number perhaps out of range of unsigned long. */
#if 123456789012345678901
#endif
/* e_14.t: Illegal #if expressions. */
#define A 1
#define B 1
/* 14.1: String literal is not allowed in #if expression. */
#if "string"
#endif /* The second error ? */
/* 14.2: Operators =, +=, ++, etc. are not allowed in #if expression. */
#if A = B
#endif
#if A++ B
#endif
#if A --B
#endif
#if A.B
#endif
/* 14.3: Unterminated #if expression. */
#if 0 <
#endif
#if ( (A == B)
#endif
/* 14.4: Unbalanced parenthesis in #if defined operator. */
#if defined ( MACRO
#endif
/* 14.5: No argument. */
#if
#endif
/* 14.6: Macro expanding to 0 token in #if expression. */
#define ZERO_TOKEN
#if ZERO_TOKEN
#endif
/* e_14_7.t: There is no keyword in #if expression. */
/* 14.7: sizeof operator is disallowed. */
/* Evaluated as: 0 (0)
Constant expression syntax error. */
#if sizeof (int)
#endif
/* 14.8: type cast is disallowed. */
/* Evaluated as: (0)0x8000
Also a constant expression error. */
#if (int)0x8000 < 0
#endif
/* e_14_9.t: Out of range in #if expression (division by 0). */
/* 14.9: Divided by 0. */
#if 1 / 0
#endif
/* e_14_10.t: Overflow of constant expression in #if directive. */
/* 14.10: */
/* In C99, #if expression is evaluated in intmax_t */
#if __STDC_VERSION__ < 199901L
#include <limits.h>
#if LONG_MAX - LONG_MIN
#endif
#if LONG_MAX + 1
#endif
#if LONG_MIN - 1
#endif
#if LONG_MAX * 2
#endif
#endif
/* e_15_3.t: #ifdef, #ifndef syntax errors. */
/* 15.3: Not an identifier. */
#ifdef "string"
#endif
#ifdef 123
#endif
/* 15.4: Excessive token sequence. */
#ifdef ZERO_TOKEN Junk
#endif
/* 15.5: No argument. */
#ifndef
#endif
/* e_16.t: Trailing junk of #else, #endif. */
/* 16.1: Trailing junk of #else. */
#define MACRO_0 0
#if MACRO_0
#else MACRO_0
/* 16.2: Trailing junk of #endif. */
#endif MACRO_0
/* e_17.t: Ill-formed group in a source file. */
#define MACRO_1 1
/* 17.1: Error of #endif without #if. */
#endif
/* 17.2: Error of #else without #if. */
#else
/* 17.3: Error of #else after #else. */
#if MACRO_1
#else /* line 159 */
#if 1
#else
#endif
#else
#endif
/* 17.4: Error of #elif after #else. */
#if MACRO_1 == 1
#else /* line 168 */
#elif MACRO_1 == 0
#endif
/* 17.5: Error of #endif without #if in an included file. */
#if 1
#include "unbal1.h"
/* 17.6: Error of unterminated #if section in an included file. */
#include "unbal2.h"
#endif
/* 17.7: Error of unterminated #if section. */
/* This error would be diagnosed at end of file. */
#if MACRO_1 == 0 /* line 182 */
#else
/* e_18_4.t: #define syntax errors. */
/* 18.4: Not an identifier. */
#define "string"
#define 123
/* 18.5: No argument. */
#define
/* 18.6: Empty parameter list. */
#define math( op, a, ) op( (a), (b))
/* 18.7: Duplicate parameter names. */
#define math( op, a, a) op( (a), (b))
/* 18.8: Argument is not an identifier. */
#define NUMARGS( 1, +, 2) (1 + 2)
/* 18.9: No space between macro name and replacement text. */
/*
C90 (Corrigendum 1) forbids this if and only the replacement text begins
with a non-basic-character.
C99 forbids this even when the replacement text begins with basic-
character.
*/
/* From ISO 9899:1990 / Corrigendum 1. */
#define THIS$AND$THAT(a, b) ((a) + (b))
/* Note: the following definition is legal (object-like macro).
#define THIS $AND$THAT(a, b) ((a) + (b))
*/
/* e_19_3.t: Redefinitions of macros. */
/* Excerpts from ISO C90 6.8.3 "Examples". */
#define OBJ_LIKE (1-1)
#define FTN_LIKE(a) ( a )
/* The following redefinitions should be diagnosed. */
/* 19.3: */
#define OBJ_LIKE (0) /* different token sequence */
/* (1-1); or (0); */
OBJ_LIKE;
/* 19.4: */
#undef OBJ_LIKE
#define OBJ_LIKE (1-1)
#define OBJ_LIKE (1 - 1) /* different white space */
/* 19.5: */
#define FTN_LIKE(b) ( a ) /* different parameter usage */
/* ( x ); or ( a); */
FTN_LIKE(x);
/* 19.6: */
#undef FTN_LIKE
#define FTN_LIKE(a) ( a )
#define FTN_LIKE(b) ( b ) /* different parameter spelling */
/* 19.7: Not in ISO C "Examples" */
#define FTN_LIKE OBJ_LIKE
/* e_23_3.t: ## operator shall not occur at the beginning or at the end of
replacement list for either form of macro definition. */
/* 23.3: In object-like macro. */
#define con ## name
#define cat 12 ##
/* 23.4: In function-like macro. */
#define CON( a, b) ## a ## b
#define CAT( b, c) b ## c ##
/* e_24_6.t: Operand of # operator in function-like macro definition shall
be a parameter name. */
/* 24.6: */
#define FUNC( a) # b
/* e_25_6.t: Macro arguments are pre-expanded separately. */
/* 25.6: */
#define sub( x, y) (x - y)
#define head sub(
#define body(x,y) x,y
#define tail )
#define head_body_tail( a, b, c) a b c
/* "head" is once replaced to "sub(", then rescanning of "sub(" causes an
uncompleted macro call. Expansion of an argument should complete
within the argument. */
head_body_tail( head, body(a,b), tail);
/* e_27_7.t: Error of rescanning. */
/* 27.7: */
#define TWO_ARGS a,b
#define SUB( x, y) sub( x, y)
/* Too many arguments error while rescanning after once replaced to:
sub( a,b, 1); */
SUB( TWO_ARGS, 1);
/* e_29_3.t: #undef errors. */
/* 29.3: Not an identifier. */
#undef "string"
#undef 123
/* 29.4: Excessive token sequence. */
#undef MACRO_0 Junk
/* 29.5: No argument. */
#undef
/* e_31.t: Illegal macro calls. */
/* 31.1: Too many arguments error. */
sub( x, y, z);
/* 31.2: Too few arguments error. */
sub( x);
/* e_31_3.t: Macro call in control line should complete in the line. */
#define glue( a, b) a ## b
#define str( s) # s
#define xstr( s) str( s)
/* 31.3: Unterminated macro call. */
#include xstr( glue( header,
.h))
/* e_32_5.t: Range error of character constant. */
/* 32.5: Value of a numerical escape sequence in character constant should
be in the range of char. */
#if '\x123' == 0x123 /* Out of range */
#endif
/* e_33_2.t: Out of range of numerical escape sequence in wide-char. */
/* 33.2: Value of a numerical escape sequence in wide-character constant
should be in the range of wchar_t. */
#if L'\xabcdef012' == 0xbcdef012 /* Perhaps out of range. */
#endif
/* e_35_2.t: Out of range of character constant. */
/* 35.2: */
#if 'abcdefghi' /* Perhaps out of range. */
#endif
/* Error of "unterminated #if section started at line 182" will be reported
at end of file. */
|