Blame test-t/e_std.t

Packit Service 8bf002
/*
Packit Service 8bf002
 *      e_std.t
Packit Service 8bf002
 *
Packit Service 8bf002
 * 1998/08      made public                                     kmatsui
Packit Service 8bf002
 * 2002/08      revised not to conflict with C99 Standard       kmatsui
Packit Service 8bf002
 * 2003/11      added a few samples                             kmatsui
Packit Service 8bf002
 *
Packit Service 8bf002
 * Samples to test Standard C preprocessing.
Packit Service 8bf002
 * Preprocessor must diagnose all of these samples appropriately.
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_4_3.t:     Illegal pp-token.   */
Packit Service 8bf002
Packit Service 8bf002
/* 4.3:     Empty character constant is an error.   */
Packit Service 8bf002
#if     '' == 0     /* This line is invalid, maybe skipped. */
Packit Service 8bf002
#endif              /* This line maybe the second error.    */
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_7_4.t:     #line error.    */
Packit Service 8bf002
Packit Service 8bf002
/* 7.4:     string literal in #line directive shall be a character string
Packit Service 8bf002
        literal.    */
Packit Service 8bf002
Packit Service 8bf002
#line   123     L"wide"
Packit Service 8bf002
/*  27; "e_std.t";  */
Packit Service 8bf002
    __LINE__; __FILE__;
Packit Service 8bf002
Packit Service 8bf002
/* Restore to correct line number.	*/
Packit Service 8bf002
#line	31
Packit Service 8bf002
Packit Service 8bf002
/* e_12_8.t:    Out of range of integer pp-token in #if expression. */
Packit Service 8bf002
/* Note:    Tests of character constant overflow are in 32.5, 33.2, 35.2.   */
Packit Service 8bf002
Packit Service 8bf002
/* 12.8:    Preprocessing number perhaps out of range of unsigned long. */
Packit Service 8bf002
#if     123456789012345678901
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_14.t:      Illegal #if expressions.    */
Packit Service 8bf002
Packit Service 8bf002
#define A   1
Packit Service 8bf002
#define B   1
Packit Service 8bf002
Packit Service 8bf002
/* 14.1:    String literal is not allowed in #if expression.    */
Packit Service 8bf002
#if     "string"
Packit Service 8bf002
#endif      /* The second error ?   */
Packit Service 8bf002
Packit Service 8bf002
/* 14.2:    Operators =, +=, ++, etc. are not allowed in #if expression.    */
Packit Service 8bf002
#if     A = B
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     A++ B
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     A --B
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     A.B
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 14.3:    Unterminated #if expression.    */
Packit Service 8bf002
#if     0 <
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     ( (A == B)
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 14.4:    Unbalanced parenthesis in #if defined operator. */
Packit Service 8bf002
#if     defined ( MACRO
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 14.5:    No argument.    */
Packit Service 8bf002
#if
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 14.6:    Macro expanding to 0 token in #if expression.   */
Packit Service 8bf002
#define ZERO_TOKEN
Packit Service 8bf002
#if     ZERO_TOKEN
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_14_7.t:    There is no keyword in #if expression.  */
Packit Service 8bf002
Packit Service 8bf002
/* 14.7:    sizeof operator is disallowed.  */
Packit Service 8bf002
/*  Evaluated as: 0 (0)
Packit Service 8bf002
    Constant expression syntax error.   */
Packit Service 8bf002
#if     sizeof (int)
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 14.8:    type cast is disallowed.    */
Packit Service 8bf002
/*  Evaluated as: (0)0x8000
Packit Service 8bf002
    Also a constant expression error.   */
Packit Service 8bf002
#if     (int)0x8000 < 0
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_14_9.t:    Out of range in #if expression (division by 0). */
Packit Service 8bf002
Packit Service 8bf002
/* 14.9:    Divided by 0.   */
Packit Service 8bf002
#if     1 / 0
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_14_10.t:   Overflow of constant expression in #if directive.   */
Packit Service 8bf002
Packit Service 8bf002
/* 14.10:   */
Packit Service 8bf002
/* In C99, #if expression is evaluated in intmax_t  */
Packit Service 8bf002
#if __STDC_VERSION__ < 199901L
Packit Service 8bf002
#include    <limits.h>
Packit Service 8bf002
Packit Service 8bf002
#if     LONG_MAX - LONG_MIN
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     LONG_MAX + 1
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     LONG_MIN - 1
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     LONG_MAX * 2
Packit Service 8bf002
#endif
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_15_3.t:    #ifdef, #ifndef syntax errors.  */
Packit Service 8bf002
Packit Service 8bf002
/* 15.3:    Not an identifier.  */
Packit Service 8bf002
#ifdef  "string"
Packit Service 8bf002
#endif
Packit Service 8bf002
#ifdef  123
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 15.4:    Excessive token sequence.   */
Packit Service 8bf002
#ifdef  ZERO_TOKEN  Junk
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 15.5:    No argument.    */
Packit Service 8bf002
#ifndef
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_16.t:  Trailing junk of #else, #endif. */
Packit Service 8bf002
Packit Service 8bf002
/* 16.1:    Trailing junk of #else. */
Packit Service 8bf002
#define MACRO_0     0
Packit Service 8bf002
#if     MACRO_0
Packit Service 8bf002
#else   MACRO_0
Packit Service 8bf002
Packit Service 8bf002
/* 16.2:    Trailing junk of #endif.    */
Packit Service 8bf002
#endif  MACRO_0
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_17.t:  Ill-formed group in a source file.  */
Packit Service 8bf002
Packit Service 8bf002
#define MACRO_1     1
Packit Service 8bf002
Packit Service 8bf002
/* 17.1:    Error of #endif without #if.    */
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 17.2:    Error of #else without #if. */
Packit Service 8bf002
#else
Packit Service 8bf002
Packit Service 8bf002
/* 17.3:    Error of #else after #else. */
Packit Service 8bf002
#if     MACRO_1
Packit Service 8bf002
#else                   /* line 159 */
Packit Service 8bf002
#if     1
Packit Service 8bf002
#else
Packit Service 8bf002
#endif
Packit Service 8bf002
#else
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 17.4:    Error of #elif after #else. */
Packit Service 8bf002
#if     MACRO_1 == 1
Packit Service 8bf002
#else                   /* line 168 */
Packit Service 8bf002
#elif   MACRO_1 == 0
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 17.5:    Error of #endif without #if in an included file.    */
Packit Service 8bf002
#if     1
Packit Service 8bf002
#include    "unbal1.h"
Packit Service 8bf002
Packit Service 8bf002
/* 17.6:    Error of unterminated #if section in an included file.  */
Packit Service 8bf002
#include    "unbal2.h"
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 17.7:    Error of unterminated #if section.  */
Packit Service 8bf002
/* This error would be diagnosed at end of file.    */
Packit Service 8bf002
#if     MACRO_1 == 0    /* line 182 */
Packit Service 8bf002
#else
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_18_4.t:    #define syntax errors.  */
Packit Service 8bf002
Packit Service 8bf002
/* 18.4:    Not an identifier.  */
Packit Service 8bf002
#define "string"
Packit Service 8bf002
#define 123
Packit Service 8bf002
Packit Service 8bf002
/* 18.5:    No argument.    */
Packit Service 8bf002
#define
Packit Service 8bf002
Packit Service 8bf002
/* 18.6:    Empty parameter list.   */
Packit Service 8bf002
#define math( op, a, )      op( (a), (b))
Packit Service 8bf002
Packit Service 8bf002
/* 18.7:    Duplicate parameter names.  */
Packit Service 8bf002
#define math( op, a, a)     op( (a), (b))
Packit Service 8bf002
Packit Service 8bf002
/* 18.8:    Argument is not an identifier.  */
Packit Service 8bf002
#define NUMARGS( 1, +, 2)   (1 + 2)
Packit Service 8bf002
Packit Service 8bf002
/* 18.9:    No space between macro name and replacement text.   */
Packit Service 8bf002
/*
Packit Service 8bf002
    C90 (Corrigendum 1) forbids this if and only the replacement text begins
Packit Service 8bf002
        with a non-basic-character.
Packit Service 8bf002
    C99 forbids this even when the replacement text begins with basic-
Packit Service 8bf002
        character.
Packit Service 8bf002
*/
Packit Service 8bf002
/*  From ISO 9899:1990 / Corrigendum 1. */
Packit Service 8bf002
#define THIS$AND$THAT(a, b)     ((a) + (b))
Packit Service 8bf002
/* Note: the following definition is legal (object-like macro).
Packit Service 8bf002
#define THIS $AND$THAT(a, b)    ((a) + (b))
Packit Service 8bf002
*/
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_19_3.t:    Redefinitions of macros.    */
Packit Service 8bf002
Packit Service 8bf002
/* Excerpts from ISO C90 6.8.3 "Examples".  */
Packit Service 8bf002
Packit Service 8bf002
#define OBJ_LIKE        (1-1)
Packit Service 8bf002
#define FTN_LIKE(a)     ( a )
Packit Service 8bf002
Packit Service 8bf002
/* The following redefinitions should be diagnosed. */
Packit Service 8bf002
Packit Service 8bf002
/* 19.3:    */
Packit Service 8bf002
#define OBJ_LIKE        (0)     /* different token sequence     */
Packit Service 8bf002
Packit Service 8bf002
/*  (1-1); or (0);  */
Packit Service 8bf002
    OBJ_LIKE;
Packit Service 8bf002
Packit Service 8bf002
/* 19.4:    */
Packit Service 8bf002
#undef  OBJ_LIKE
Packit Service 8bf002
#define OBJ_LIKE        (1-1)
Packit Service 8bf002
#define OBJ_LIKE        (1 - 1) /* different white space        */
Packit Service 8bf002
Packit Service 8bf002
/* 19.5:    */
Packit Service 8bf002
#define FTN_LIKE(b)     ( a )   /* different parameter usage    */
Packit Service 8bf002
Packit Service 8bf002
/*  ( x ); or ( a); */
Packit Service 8bf002
    FTN_LIKE(x);
Packit Service 8bf002
Packit Service 8bf002
/* 19.6:    */
Packit Service 8bf002
#undef  FTN_LIKE
Packit Service 8bf002
#define FTN_LIKE(a)     ( a )
Packit Service 8bf002
#define FTN_LIKE(b)     ( b )   /* different parameter spelling */
Packit Service 8bf002
Packit Service 8bf002
/* 19.7:    Not in ISO C "Examples" */
Packit Service 8bf002
#define FTN_LIKE        OBJ_LIKE
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_23_3.t:    ## operator shall not occur at the beginning or at the end of
Packit Service 8bf002
        replacement list for either form of macro definition.   */
Packit Service 8bf002
Packit Service 8bf002
/* 23.3:    In object-like macro.   */
Packit Service 8bf002
#define con     ## name
Packit Service 8bf002
#define cat     12 ##
Packit Service 8bf002
Packit Service 8bf002
/* 23.4:    In function-like macro. */
Packit Service 8bf002
#define CON( a, b)  ## a ## b
Packit Service 8bf002
#define CAT( b, c)  b ## c ##
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_24_6.t:    Operand of # operator in function-like macro definition shall
Packit Service 8bf002
        be a parameter name.    */
Packit Service 8bf002
Packit Service 8bf002
/* 24.6:    */
Packit Service 8bf002
#define FUNC( a)    # b
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_25_6.t:    Macro arguments are pre-expanded separately.    */
Packit Service 8bf002
Packit Service 8bf002
/* 25.6:    */
Packit Service 8bf002
#define sub( x, y)      (x - y)
Packit Service 8bf002
#define head            sub(
Packit Service 8bf002
#define body(x,y)       x,y
Packit Service 8bf002
#define tail            )
Packit Service 8bf002
#define head_body_tail( a, b, c)    a b c
Packit Service 8bf002
/* "head" is once replaced to "sub(", then rescanning of "sub(" causes an
Packit Service 8bf002
        uncompleted macro call.  Expansion of an argument should complete
Packit Service 8bf002
        within the argument.    */
Packit Service 8bf002
    head_body_tail( head, body(a,b), tail);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_27_7.t:    Error of rescanning.    */
Packit Service 8bf002
Packit Service 8bf002
/* 27.7:    */
Packit Service 8bf002
#define TWO_ARGS        a,b
Packit Service 8bf002
#define SUB( x, y)      sub( x, y)
Packit Service 8bf002
/* Too many arguments error while rescanning after once replaced to:
Packit Service 8bf002
    sub( a,b, 1);   */
Packit Service 8bf002
    SUB( TWO_ARGS, 1);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_29_3.t:    #undef errors.  */
Packit Service 8bf002
Packit Service 8bf002
/* 29.3:    Not an identifier.  */
Packit Service 8bf002
#undef  "string"
Packit Service 8bf002
#undef  123
Packit Service 8bf002
Packit Service 8bf002
/* 29.4:    Excessive token sequence.   */
Packit Service 8bf002
#undef  MACRO_0     Junk
Packit Service 8bf002
Packit Service 8bf002
/* 29.5:    No argument.    */
Packit Service 8bf002
#undef
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_31.t:  Illegal macro calls.    */
Packit Service 8bf002
Packit Service 8bf002
/* 31.1:    Too many arguments error.   */
Packit Service 8bf002
    sub( x, y, z);
Packit Service 8bf002
Packit Service 8bf002
/* 31.2:    Too few arguments error.    */
Packit Service 8bf002
    sub( x);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_31_3.t:    Macro call in control line should complete in the line. */
Packit Service 8bf002
Packit Service 8bf002
#define glue( a, b)     a ## b
Packit Service 8bf002
#define str( s)         # s
Packit Service 8bf002
#define xstr( s)        str( s)
Packit Service 8bf002
Packit Service 8bf002
/* 31.3:    Unterminated macro call.    */
Packit Service 8bf002
#include    xstr( glue( header,
Packit Service 8bf002
    .h))
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_32_5.t:    Range error of character constant.  */
Packit Service 8bf002
Packit Service 8bf002
/* 32.5:    Value of a numerical escape sequence in character constant should
Packit Service 8bf002
        be in the range of char.    */
Packit Service 8bf002
#if     '\x123' == 0x123        /* Out of range */
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_33_2.t:    Out of range of numerical escape sequence in wide-char. */
Packit Service 8bf002
Packit Service 8bf002
/* 33.2:    Value of a numerical escape sequence in wide-character constant
Packit Service 8bf002
        should be in the range of wchar_t.  */
Packit Service 8bf002
#if     L'\xabcdef012' == 0xbcdef012        /* Perhaps out of range.    */
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* e_35_2.t:    Out of range of character constant. */
Packit Service 8bf002
Packit Service 8bf002
/* 35.2:    */
Packit Service 8bf002
#if     'abcdefghi'     /* Perhaps out of range.    */
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* Error of "unterminated #if section started at line 182" will be reported
Packit Service 8bf002
    at end of file. */
Packit Service 8bf002