Blame test-t/n_post.t

Packit Service 8bf002
/*
Packit Service 8bf002
 *      n_post.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
 *
Packit Service 8bf002
 *   Samples to test "POST_STANDARD" mode of C preprocessing.
Packit Service 8bf002
 *   POST_STANDARD cpp must process these samples as shown in each comments.
Packit Service 8bf002
 *   POST_STANDARD cpp must process also #error directive properly, which is
Packit Service 8bf002
 * not included here because the directive might cause translator to
Packit Service 8bf002
 * terminate.
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
#define ZERO_TOKEN
Packit Service 8bf002
#define TWO_ARGS        a,b
Packit Service 8bf002
#define MACRO_0         0
Packit Service 8bf002
#define MACRO_1         1
Packit Service 8bf002
#define sub( x, y)      (x - y)
Packit Service 8bf002
#define str( a)         # a
Packit Service 8bf002
#define glue( a, b)     a ## b
Packit Service 8bf002
#define xglue( a, b)    glue( a, b)
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_2.t:   Line splicing by <backslash><newline> sequence. */
Packit Service 8bf002
Packit Service 8bf002
/* 2.1: In a #define directive line, between the parameter list and the
Packit Service 8bf002
        replacement text.   */
Packit Service 8bf002
/*  ab + cd + ef ;  */
Packit Service 8bf002
#define FUNC( a, b, c)  \
Packit Service 8bf002
        a + b + c
Packit Service 8bf002
    FUNC( ab, cd, ef);
Packit Service 8bf002
Packit Service 8bf002
/* 2.2: In a #define directive line, among the parameter list and among the
Packit Service 8bf002
        replacement text.   */
Packit Service 8bf002
/*  ab + cd + ef ;  */
Packit Service 8bf002
#undef  FUNC
Packit Service 8bf002
#define FUNC( a, b  \
Packit Service 8bf002
        , c)        \
Packit Service 8bf002
        a + b       \
Packit Service 8bf002
        + c
Packit Service 8bf002
    FUNC( ab, cd, ef);
Packit Service 8bf002
Packit Service 8bf002
/* 2.3: In a string literal.    */
Packit Service 8bf002
/*  "abcde" */
Packit Service 8bf002
    "abc\
Packit Service 8bf002
de"
Packit Service 8bf002
Packit Service 8bf002
/* 2.4: <backslash><newline> in midst of an identifier. */
Packit Service 8bf002
/*  abcde   */
Packit Service 8bf002
    abc\
Packit Service 8bf002
de
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_3.t:   Handling of comment.    */
Packit Service 8bf002
Packit Service 8bf002
/* 3.1: A comment is converted to one space.    */
Packit Service 8bf002
/*  abc de  */
Packit Service 8bf002
    abc/* comment */de
Packit Service 8bf002
Packit Service 8bf002
/* 3.2: // is not a comment of C.   */
Packit Service 8bf002
#if 0   /* This feature is obsolete now.  */
Packit Service 8bf002
/*  / / is not a comment of C   */
Packit Service 8bf002
    // is not a comment of C
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 3.3: Comment is parsed prior to the parsing of preprocessing directive.  */
Packit Service 8bf002
/*  abcd    */
Packit Service 8bf002
#if     0
Packit Service 8bf002
    "nonsence"; /*
Packit Service 8bf002
#else
Packit Service 8bf002
    still in
Packit Service 8bf002
    comment     */
Packit Service 8bf002
#else
Packit Service 8bf002
#define MACRO_abcd  /*
Packit Service 8bf002
    in comment
Packit Service 8bf002
    */  abcd
Packit Service 8bf002
#endif
Packit Service 8bf002
    MACRO_abcd
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_4.t:   Special tokens. */
Packit Service 8bf002
Packit Service 8bf002
/* 4.1: Digraph spellings in directive line.    */
Packit Service 8bf002
/*  "abc" ; */
Packit Service 8bf002
%: define  stringize( a)    %: a
Packit Service 8bf002
Packit Service 8bf002
    stringize( abc);
Packit Service 8bf002
Packit Service 8bf002
/* 4.2: Digraph spellings are converted in translation phase 1. */
Packit Service 8bf002
/*  "[" ;   */
Packit Service 8bf002
    stringize( <:);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_5.t:   Spaces or tabs are allowed at any place in pp-directive line,
Packit Service 8bf002
        including between the top of a pp-directive line and '#', and between
Packit Service 8bf002
        the '#' and the directive. */
Packit Service 8bf002
Packit Service 8bf002
/* 5.1: */
Packit Service 8bf002
/*  |**|[TAB]# |**|[TAB]define |**| MACRO_abcde[TAB]|**| abcde |**| */
Packit Service 8bf002
/**/    # /**/  define /**/ MACRO_abcde /**/ abcde /**/
Packit Service 8bf002
/*  abcde   */
Packit Service 8bf002
    MACRO_abcde
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_6.t:   #include directive. */
Packit Service 8bf002
Packit Service 8bf002
/* 6.1: Header-name quoted by " and " as well as by < and > can include
Packit Service 8bf002
        standard headers.   */
Packit Service 8bf002
/* Note: Standard headers can be included any times.    */
Packit Service 8bf002
#include    "ctype.h"
Packit Service 8bf002
#include    <ctype.h>       /* An obsolescent feature.  */
Packit Service 8bf002
Packit Service 8bf002
/* 6.2: Macro is allowed in #include line.  */
Packit Service 8bf002
#define HEADER  "header.h"
Packit Service 8bf002
/* Before file inclusion:   #include "header.h" */
Packit Service 8bf002
#include    HEADER
Packit Service 8bf002
/*  abc */
Packit Service 8bf002
    MACRO_abc
Packit Service 8bf002
Packit Service 8bf002
/* 6.3: With macro nonsence but legal.  */
Packit Service 8bf002
#undef  MACRO_abc
Packit Service 8bf002
#include    ZERO_TOKEN HEADER ZERO_TOKEN
Packit Service 8bf002
/*  abc */
Packit Service 8bf002
    MACRO_abc
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_7.t:   #line directive.    */
Packit Service 8bf002
Packit Service 8bf002
/* 7.1: Line number and filename.   */
Packit Service 8bf002
/*  1234 ; "cpp" ;  */
Packit Service 8bf002
#line   1234    "cpp"
Packit Service 8bf002
    __LINE__; __FILE__;
Packit Service 8bf002
Packit Service 8bf002
/* 7.2: Filename argument is optional.  */
Packit Service 8bf002
/*  2345 ; "cpp" ;  */
Packit Service 8bf002
#line   2345
Packit Service 8bf002
    __LINE__; __FILE__;
Packit Service 8bf002
Packit Service 8bf002
/* 7.3: Argument with macro.    */
Packit Service 8bf002
/*  3456 ; "n_7.t" ;    */
Packit Service 8bf002
#define LINE_AND_FILENAME   3456 "n_7.t"
Packit Service 8bf002
#line   LINE_AND_FILENAME
Packit Service 8bf002
    __LINE__; __FILE__;
Packit Service 8bf002
Packit Service 8bf002
/* Restore to correct line number and filename. */
Packit Service 8bf002
#line   149 "n_post.t"
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_9.t:   #pragma directive.  */
Packit Service 8bf002
Packit Service 8bf002
/* 9.1: Any #pragma directive should be processed or ignored, should not
Packit Service 8bf002
        be diagnosed as an error.   */
Packit Service 8bf002
#pragma once
Packit Service 8bf002
#pragma who knows ?
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_10.t:  #if, #elif, #else and #endif pp-directive.  */
Packit Service 8bf002
Packit Service 8bf002
/* 10.1:    */
Packit Service 8bf002
/* Note: an undefined identifier in #if expression is replaced to 0.    */
Packit Service 8bf002
/*  1 ; */
Packit Service 8bf002
#if     a
Packit Service 8bf002
    a;
Packit Service 8bf002
#elif MACRO_0
Packit Service 8bf002
    MACRO_0;
Packit Service 8bf002
#elif   MACRO_1         /* Valid block  */
Packit Service 8bf002
    MACRO_1;
Packit Service 8bf002
#else
Packit Service 8bf002
    0;
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 10.2:    Comments must be processed even if in skipped #if block.    */
Packit Service 8bf002
/* At least tokenization of string literal and character constant is necessary
Packit Service 8bf002
        to process comments, e.g. /* is not a comment mark in string literal.
Packit Service 8bf002
 */
Packit Service 8bf002
#ifdef  UNDEFINED
Packit Service 8bf002
    /* Comment  */
Packit Service 8bf002
    "in literal /* is not a comment"
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_11.t:  Operator "defined" in #if or #elif directive.   */
Packit Service 8bf002
Packit Service 8bf002
/* 11.1:    */
Packit Service 8bf002
#undef  MACRO_abc
Packit Service 8bf002
#define MACRO_abc   abc
Packit Service 8bf002
/*  abc ;   */
Packit Service 8bf002
/*  abc ;   */
Packit Service 8bf002
#if     defined a
Packit Service 8bf002
    a;
Packit Service 8bf002
#else
Packit Service 8bf002
    MACRO_abc;
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     defined (MACRO_abc)
Packit Service 8bf002
    MACRO_abc;
Packit Service 8bf002
#else
Packit Service 8bf002
    0;
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 11.2:    "defined" is an unary operator whose result is 1 or 0.  */
Packit Service 8bf002
#if     defined MACRO_0 * 3 != 3
Packit Service 8bf002
    Bad handling of "defined" operator.
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     (!defined ZERO_TOKEN != 0) || (-defined ZERO_TOKEN != -1)
Packit Service 8bf002
    Bad grouping of "defined", !, - operator.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_12.t:  Integer preprocessing number token and type of #if expression.  */
Packit Service 8bf002
Packit Service 8bf002
#include    "limits.h"
Packit Service 8bf002
Packit Service 8bf002
/* 12.1:    Type long.  */
Packit Service 8bf002
#if     LONG_MAX <= LONG_MIN
Packit Service 8bf002
    Bad evaluation of long.
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     LONG_MAX <= 1073741823  /* 0x3FFFFFFF   */
Packit Service 8bf002
    Bad evaluation of long.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 12.2:    Type unsigned long. */
Packit Service 8bf002
#if     ULONG_MAX / 2 < LONG_MAX
Packit Service 8bf002
    Bad evaluation of unsigned long.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 12.3:    Octal number.   */
Packit Service 8bf002
#if     0177777 != 65535
Packit Service 8bf002
    Bad evaluation of octal number.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 12.4:    Hexadecimal number. */
Packit Service 8bf002
#if     0Xffff != 65535 || 0xFfFf != 65535
Packit Service 8bf002
    Bad evaluation of hexadecimal number.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 12.5:    Suffix 'L' or 'l'.  */
Packit Service 8bf002
#if     0L != 0 || 0l != 0
Packit Service 8bf002
    Bad evaluation of 'L' suffix.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 12.6:    Suffix 'U' or 'u'.  */
Packit Service 8bf002
#if     1U != 1 || 1u != 1
Packit Service 8bf002
    Bad evaluation of 'U' suffix.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_13.t:  Valid operators in #if expression.  */
Packit Service 8bf002
Packit Service 8bf002
/* Valid operators are (precedence in this order) :
Packit Service 8bf002
    defined, (unary)+, (unary)-, ~, !,
Packit Service 8bf002
    *, /, %,
Packit Service 8bf002
    +, -,
Packit Service 8bf002
    <<, >>,
Packit Service 8bf002
    <, >, <=, >=,
Packit Service 8bf002
    ==, !=,
Packit Service 8bf002
    &,
Packit Service 8bf002
    ^,
Packit Service 8bf002
    |,
Packit Service 8bf002
    &&,
Packit Service 8bf002
    ||,
Packit Service 8bf002
    ? :
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
/* 13.1:    Bit shift.  */
Packit Service 8bf002
#if     1 << 2 != 4 || 8 >> 1 != 4
Packit Service 8bf002
    Bad arithmetic of <<, >> operators.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.2:    Bitwise operators.  */
Packit Service 8bf002
#if     (3 ^ 5) != 6 || (3 | 5) != 7 || (3 & 5) != 1
Packit Service 8bf002
    Bad arithmetic of ^, |, & operators.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.3:    Result of ||, && operators is either of 1 or 0. */
Packit Service 8bf002
#if     (2 || 3) != 1 || (2 && 3) != 1 || (0 || 4) != 1 || (0 && 5) != 0
Packit Service 8bf002
    Bad arithmetic of ||, && operators.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.4:    ?, : operator.  */
Packit Service 8bf002
#if     (0 ? 1 : 2) != 2
Packit Service 8bf002
    Bad arithmetic of ?: operator.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_13_5.t:    Arithmetic conversion in #if expressions.   */
Packit Service 8bf002
Packit Service 8bf002
/* 13.5:    The usual arithmetic conversion is not performed on bit shift.  */
Packit Service 8bf002
#if     -1 << 3U > 0
Packit Service 8bf002
    Bad conversion of bit shift operands.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.6:    Usual arithmetic conversions.   */
Packit Service 8bf002
#if     -1 <= 0U        /* -1 is converted to unsigned long.    */
Packit Service 8bf002
    Bad arithmetic conversion.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
#if     -1 * 1U <= 0
Packit Service 8bf002
    Bad arithmetic conversion.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* Second and third operands of conditional operator are converted to the
Packit Service 8bf002
        same type, thus -1 is converted to unsigned long.    */
Packit Service 8bf002
#if     (1 ? -1 : 0U) <= 0
Packit Service 8bf002
    Bad arithmetic conversion.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_13_7.t:    Short-circuit evaluation of #if expression. */
Packit Service 8bf002
Packit Service 8bf002
/* 13.7:    10/0 or 10/MACRO_0 are never evaluated, "divide by zero" error
Packit Service 8bf002
        cannot occur.   */
Packit Service 8bf002
/*  Valid block */
Packit Service 8bf002
#if     0 && 10 / 0
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     not_defined && 10 / not_defined
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     MACRO_0 && 10 / MACRO_0 > 1
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     MACRO_0 ? 10 / MACRO_0 : 0
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     MACRO_0 == 0 || 10 / MACRO_0 > 1
Packit Service 8bf002
    Valid block
Packit Service 8bf002
#else
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_13_8.t:    Grouping of sub-expressions in #if expression.  */
Packit Service 8bf002
Packit Service 8bf002
/* 13.8:    Unary operators are grouped from right to left. */
Packit Service 8bf002
#if     (- -1 != 1) || (!!9 != 1) || (-!+!9 != -1) || (~~1 != 1)
Packit Service 8bf002
    Bad grouping of -, +, !, ~ in #if expression.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.9:    ?: operators are grouped from right to left.    */
Packit Service 8bf002
#if     (1 ? 2 ? 3 ? 3 : 2 : 1 : 0) != 3
Packit Service 8bf002
    Bad grouping of ? : in #if expression.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.10:   Other operators are grouped from left to right. */
Packit Service 8bf002
#if     (15 >> 2 >> 1 != 1) || (3 << 2 << 1 != 24)
Packit Service 8bf002
    Bad grouping of >>, << in #if expression.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.11:   Test of precedence. */
Packit Service 8bf002
#if     3*10/2 >> !0*2 >> !+!-9 != 1
Packit Service 8bf002
    Bad grouping of -, +, !, *, /, >> in #if expression.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.12:   Overall test.  Grouped as:
Packit Service 8bf002
        ((((((+1 - -1 - ~~1 - -!0) & 6) | ((8 % 9) ^ (-2 * -2))) >> 1) == 7)
Packit Service 8bf002
        ? 7 : 0) != 7
Packit Service 8bf002
    evaluated to FALSE.
Packit Service 8bf002
 */
Packit Service 8bf002
#if     (((+1- -1-~~1- -!0&6|8%9^-2*-2)>>1)==7?7:0)!=7
Packit Service 8bf002
    Bad arithmetic of #if expression.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_13_13.t:   #if expression with macros. */
Packit Service 8bf002
Packit Service 8bf002
#define and             &&
Packit Service 8bf002
#define or              ||
Packit Service 8bf002
#define not_eq          !=
Packit Service 8bf002
#define bitor           |
Packit Service 8bf002
Packit Service 8bf002
/* 13.13:   With macros expanding to operators. */
Packit Service 8bf002
/*  Valid block */
Packit Service 8bf002
#if     (1 bitor 2) == 3 and 4 not_eq 5 or 0
Packit Service 8bf002
    /* #if (1 | 2) == 3 && 4 != 5 || 0  */
Packit Service 8bf002
    Valid block
Packit Service 8bf002
#else
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 13.14:   With macros expanding to 0 token, nonsence but legal expression.*/
Packit Service 8bf002
/*  Valid block */
Packit Service 8bf002
#if     ZERO_TOKEN MACRO_1 ZERO_TOKEN > ZERO_TOKEN MACRO_0 ZERO_TOKEN
Packit Service 8bf002
    /* #if 1 > 0    */
Packit Service 8bf002
    Valid block
Packit Service 8bf002
#else
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_15.t:  #ifdef, #ifndef directives. */
Packit Service 8bf002
Packit Service 8bf002
/* 15.1:    #ifdef directive.   */
Packit Service 8bf002
/*  Valid block */
Packit Service 8bf002
#ifdef  MACRO_1
Packit Service 8bf002
    Valid block
Packit Service 8bf002
#else
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 15.2:    #ifndef directive.  */
Packit Service 8bf002
/*  Valid block */
Packit Service 8bf002
#ifndef MACRO_1
Packit Service 8bf002
    Block to be skipped
Packit Service 8bf002
#else
Packit Service 8bf002
    Valid block
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_18.t:  #define directive.  */
Packit Service 8bf002
Packit Service 8bf002
/* Excerpts from ISO C 6.8.3 "Examples".    */
Packit Service 8bf002
#define OBJ_LIKE        (1-1)
Packit Service 8bf002
#define FTN_LIKE(a)     ( a )
Packit Service 8bf002
Packit Service 8bf002
/* 18.1:    Definition of an object-like macro. */
Packit Service 8bf002
/*  ( 1 - 1 ) ; */
Packit Service 8bf002
    OBJ_LIKE;
Packit Service 8bf002
Packit Service 8bf002
/* 18.2:    Definition of a function-like macro.    */
Packit Service 8bf002
/*  ( c ) ; */
Packit Service 8bf002
    FTN_LIKE( c);
Packit Service 8bf002
Packit Service 8bf002
/* 18.3:    Spelling in string identical to parameter is not a parameter.   */
Packit Service 8bf002
/*  "n1:n2" ;   */
Packit Service 8bf002
#define STR( n1, n2)    "n1:n2"
Packit Service 8bf002
    STR( 1, 2);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_19.t:  Valid re-definitions of macros. */
Packit Service 8bf002
Packit Service 8bf002
/* 19.1:    */
Packit Service 8bf002
#define OBJ_LIKE    /* white space */  (1-1) /* other */
Packit Service 8bf002
Packit Service 8bf002
/* 19.2:    */
Packit Service 8bf002
#define FTN_LIKE( a     )(  /* note the white space */  \
Packit Service 8bf002
                        a  /* other stuff on this line
Packit Service 8bf002
                           */ )
Packit Service 8bf002
Packit Service 8bf002
/* 19.4:    */
Packit Service 8bf002
#define OBJ_LIKE        (1 - 1) /* different white space        */
Packit Service 8bf002
Packit Service 8bf002
/* 19.6:    */
Packit Service 8bf002
#define FTN_LIKE(b)     ( b )   /* different parameter spelling */
Packit Service 8bf002
Packit Service 8bf002
/*  ( c ) ; */
Packit Service 8bf002
    FTN_LIKE( c);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_20.t:  Definition of macro lexically identical to keyword. */
Packit Service 8bf002
Packit Service 8bf002
/* 20.1:    */
Packit Service 8bf002
/*  double fl ; */
Packit Service 8bf002
#define float   double
Packit Service 8bf002
    float   fl;
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_21.t:  Tokenization (No preprocessing tokens are merged implicitly).   */
Packit Service 8bf002
Packit Service 8bf002
/* 21.1:    */
Packit Service 8bf002
/*  - - - a ;   */
Packit Service 8bf002
#define MINUS   -
Packit Service 8bf002
    -MINUS-a;
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_22.t:  Tokenization of preprocessing number.   */
Packit Service 8bf002
Packit Service 8bf002
#define EXP         1
Packit Service 8bf002
Packit Service 8bf002
/* 22.1:    12E+EXP is a preprocessing number, EXP is not expanded. */
Packit Service 8bf002
/*  12E+EXP ;   */
Packit Service 8bf002
    12E+EXP;
Packit Service 8bf002
Packit Service 8bf002
/* 22.2:    .2e-EXP is also a preprocessing number. */
Packit Service 8bf002
/*  .2e-EXP ;   */
Packit Service 8bf002
    .2e-EXP;
Packit Service 8bf002
Packit Service 8bf002
/* 22.3:    + or - is allowed only following E or e, 12+EXP is not a
Packit Service 8bf002
        preprocessing number.   */
Packit Service 8bf002
/* Three tokens: 12 + 1 ;   */
Packit Service 8bf002
    12+EXP;
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_23.t:  ## operator in macro definition.    */
Packit Service 8bf002
Packit Service 8bf002
/* 23.1:    */
Packit Service 8bf002
/*  xy ;    */
Packit Service 8bf002
    glue( x, y);
Packit Service 8bf002
Packit Service 8bf002
/* 23.2:    Generate a preprocessing number.    */
Packit Service 8bf002
/*  .12e+2 ;    */
Packit Service 8bf002
#undef  EXP
Packit Service 8bf002
#define EXP     2
Packit Service 8bf002
    xglue( .12e+, EXP);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_24.t:  # operator in macro definition. */
Packit Service 8bf002
Packit Service 8bf002
/* 24.1:    */
Packit Service 8bf002
/*  "a + b" ;   */
Packit Service 8bf002
    str( a+b);
Packit Service 8bf002
Packit Service 8bf002
/* 24.2:    White spaces between tokens of operand are converted to one space.
Packit Service 8bf002
 */
Packit Service 8bf002
/*  "ab + cd" ; */
Packit Service 8bf002
    str(    ab  /* comment */   +
Packit Service 8bf002
        cd  );
Packit Service 8bf002
Packit Service 8bf002
/* 24.3:    \ is inserted before \ and " in or surrounding literals and no
Packit Service 8bf002
        other character is inserted to anywhere.    */
Packit Service 8bf002
/*  "'\"' + \"' \\\"\"" ;   */
Packit Service 8bf002
    str( '"' + "' \"");
Packit Service 8bf002
Packit Service 8bf002
/* 24.4:    Line splicing by <backslash><newline> is done prior to token
Packit Service 8bf002
        parsing.    */
Packit Service 8bf002
/*  "\"abc\"" ; */
Packit Service 8bf002
    str( "ab\
Packit Service 8bf002
c");
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_25.t:  Macro arguments are pre-expanded (unless the argument is an
Packit Service 8bf002
        operand of # or ## operator) separately, that is, macro-replaced
Packit Service 8bf002
        completely prior to rescanning. */
Packit Service 8bf002
Packit Service 8bf002
/* 25.1:    "TWO_ARGS" is read as one argument to "sub", then expanded to
Packit Service 8bf002
        "a , b", then "x" is substituted by "a , b".    */
Packit Service 8bf002
/*  ( a , b - 1 ) ; */
Packit Service 8bf002
    sub( TWO_ARGS, 1);
Packit Service 8bf002
Packit Service 8bf002
/* 25.2:    An argument pre-expanded to 0-token.    */
Packit Service 8bf002
/*  (  - 1 ) ;  */
Packit Service 8bf002
    sub( ZERO_TOKEN, 1);
Packit Service 8bf002
Packit Service 8bf002
/* 25.3:    "glue( a, b)" is pre-expanded.  */
Packit Service 8bf002
/*  abc ;   */
Packit Service 8bf002
    xglue( glue( a, b), c);
Packit Service 8bf002
Packit Service 8bf002
/* 25.4:    Operands of ## operator are not pre-expanded.   */
Packit Service 8bf002
/*  MACRO_0MACRO_1 ;    */
Packit Service 8bf002
    glue( MACRO_0, MACRO_1);
Packit Service 8bf002
Packit Service 8bf002
/* 25.5:    Operand of # operator is not pre-expanded.  */
Packit Service 8bf002
/*  "ZERO_TOKEN" ;  */
Packit Service 8bf002
    str( ZERO_TOKEN);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_26.t:  The name once replaced is not furthur replaced. */
Packit Service 8bf002
Packit Service 8bf002
/* 26.1:    Directly recursive object-like macro definition.    */
Packit Service 8bf002
/*  Z [ 0 ] ;   */
Packit Service 8bf002
#define Z   Z[0]
Packit Service 8bf002
    Z;
Packit Service 8bf002
Packit Service 8bf002
/* 26.2:    Intermediately recursive object-like macro definition.  */
Packit Service 8bf002
/*  AB ;    */
Packit Service 8bf002
#define AB  BA
Packit Service 8bf002
#define BA  AB
Packit Service 8bf002
    AB;
Packit Service 8bf002
Packit Service 8bf002
/* 26.3:    Directly recursive function-like macro definition.  */
Packit Service 8bf002
/*  x + f ( x ) ;   */
Packit Service 8bf002
#define f(a)    a + f(a)
Packit Service 8bf002
    f( x);
Packit Service 8bf002
Packit Service 8bf002
/* 26.4:    Intermediately recursive function-like macro definition.    */
Packit Service 8bf002
/*  x + x + g ( x ) ;   */
Packit Service 8bf002
#define g(a)    a + h( a)
Packit Service 8bf002
#define h(a)    a + g( a)
Packit Service 8bf002
    g( x);
Packit Service 8bf002
Packit Service 8bf002
/* 26.5:    Rescanning encounters the non-replaced macro name.  */
Packit Service 8bf002
/*  Z [ 0 ] + f ( Z [ 0 ] ) ;   */
Packit Service 8bf002
    f( Z);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_27.t:  Rescanning of a macro expand any macro call in the replacement
Packit Service 8bf002
        text after substitution of parameters by pre-expanded-arguments.  This
Packit Service 8bf002
        re-examination does not involve the succeding sequences from the
Packit Service 8bf002
        source file.    */
Packit Service 8bf002
Packit Service 8bf002
/* 27.1:    Cascaded use of object-like macros. */
Packit Service 8bf002
/*  1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 ; */
Packit Service 8bf002
#define NEST8   NEST7 + 8
Packit Service 8bf002
#define NEST7   NEST6 + 7
Packit Service 8bf002
#define NEST6   NEST5 + 6
Packit Service 8bf002
#define NEST5   NEST4 + 5
Packit Service 8bf002
#define NEST4   NEST3 + 4
Packit Service 8bf002
#define NEST3   NEST2 + 3
Packit Service 8bf002
#define NEST2   NEST1 + 2
Packit Service 8bf002
#define NEST1   1
Packit Service 8bf002
    NEST8;
Packit Service 8bf002
Packit Service 8bf002
/* 27.2:    Cascaded use of function-like macros.   */
Packit Service 8bf002
/*  ( 1 ) + ( 1 + 2 ) + 1 + 2 + 1 + 2 + 3 + 1 + 2 + 3 + 4 ; */
Packit Service 8bf002
#define FUNC4( a, b)    FUNC3( a, b) + NEST4
Packit Service 8bf002
#define FUNC3( a, b)    FUNC2( a, b) + NEST3
Packit Service 8bf002
#define FUNC2( a, b)    FUNC1( a, b) + NEST2
Packit Service 8bf002
#define FUNC1( a, b)    (a) + (b)
Packit Service 8bf002
    FUNC4( NEST1, NEST2);
Packit Service 8bf002
Packit Service 8bf002
/* 27.3:    An identifier generated by ## operator is subject to expansion. */
Packit Service 8bf002
/*  1 ; */
Packit Service 8bf002
    glue( MACRO_, 1);
Packit Service 8bf002
Packit Service 8bf002
#define head            sub(
Packit Service 8bf002
#define math( op, a, b) op( (a), (b))
Packit Service 8bf002
#define SUB             sub
Packit Service 8bf002
Packit Service 8bf002
/* 27.4:    "sub" as an argument of math() is not pre-expanded, since '(' is
Packit Service 8bf002
        missing.    */
Packit Service 8bf002
/*  ( ( a ) - ( b ) ) ; */
Packit Service 8bf002
    math( sub, a, b);
Packit Service 8bf002
Packit Service 8bf002
/* 27.5:    Object-like macro expanded to name of a function-like macro.    */
Packit Service 8bf002
/*  sub ( a , b ) ; */
Packit Service 8bf002
    SUB( a, b);
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_28.t:  __FILE__, __LINE__, __DATE__, __TIME__, __STDC__ and
Packit Service 8bf002
            __STDC_VERSION__ are predefined.    */
Packit Service 8bf002
Packit Service 8bf002
/* 28.1:    */
Packit Service 8bf002
/*  "n_post.t" ;    */
Packit Service 8bf002
    __FILE__;
Packit Service 8bf002
Packit Service 8bf002
/* 28.2:    */
Packit Service 8bf002
/*  629 ;   */
Packit Service 8bf002
    __LINE__;
Packit Service 8bf002
Packit Service 8bf002
/* 28.3:    */
Packit Service 8bf002
/*  "Aug  1 2001";  */
Packit Service 8bf002
    __DATE__;
Packit Service 8bf002
Packit Service 8bf002
/* 28.4:    */
Packit Service 8bf002
/*  "21:42:22" ;    */
Packit Service 8bf002
    __TIME__;
Packit Service 8bf002
Packit Service 8bf002
/* 28.5:    */
Packit Service 8bf002
/*  1 ; */
Packit Service 8bf002
    __STDC__;
Packit Service 8bf002
Packit Service 8bf002
/* 28.6:    */
Packit Service 8bf002
/*  199409L ;   */
Packit Service 8bf002
/* In C99, the value of this macro is 199901L   */
Packit Service 8bf002
    __STDC_VERSION__;
Packit Service 8bf002
Packit Service 8bf002
/* 28.7:    __LINE__, __FILE__ in an included file. */
Packit Service 8bf002
/*  3 ; "line.h" ;  */
Packit Service 8bf002
#include    "line.h"
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_29.t:  #undef directive.   */
Packit Service 8bf002
Packit Service 8bf002
/* 29.1:    Undefined macro is not a macro. */
Packit Service 8bf002
/*  DEFINED ;   */
Packit Service 8bf002
#define DEFINED
Packit Service 8bf002
#undef  DEFINED
Packit Service 8bf002
    DEFINED;
Packit Service 8bf002
Packit Service 8bf002
/* 29.2:    Undefining undefined name is not an error.  */
Packit Service 8bf002
#undef  UNDEFINED
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_30.t:  Macro call. */
Packit Service 8bf002
/*  Note:   Comma separate the arguments of function-like macro call,
Packit Service 8bf002
        but comma between matching inner parenthesis doesn't.  This feature
Packit Service 8bf002
        is tested on so many places in this suite especially on *.c samples
Packit Service 8bf002
        which use assert() macro, that no separete item to test this feature
Packit Service 8bf002
        is provided.    */
Packit Service 8bf002
Packit Service 8bf002
/* 30.1:    A macro call may cross the lines.   */
Packit Service 8bf002
#define FUNC( a, b, c)      a + b + c
Packit Service 8bf002
/*  a + b + c ; */
Packit Service 8bf002
    FUNC
Packit Service 8bf002
    (
Packit Service 8bf002
        a,
Packit Service 8bf002
        b,
Packit Service 8bf002
        c
Packit Service 8bf002
    )
Packit Service 8bf002
    ;
Packit Service 8bf002
Packit Service 8bf002
Packit Service 8bf002
/* n_37.t:  Translation limits. */
Packit Service 8bf002
Packit Service 8bf002
/* 37.1:    Number of parameters in macro: at least 31. */
Packit Service 8bf002
#define glue31(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E)   \
Packit Service 8bf002
    a##b##c##d##e##f##g##h##i##j##k##l##m##n##o##p##q##r##s##t##u##v##w##x##y##z##A##B##C##D##E
Packit Service 8bf002
Packit Service 8bf002
/* 37.2:    Number of arguments of macro call: at least 31. */
Packit Service 8bf002
/*  ABCDEFGHIJKLMNOPQRSTUVWXYZabcde ;   */
Packit Service 8bf002
    glue31( A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R
Packit Service 8bf002
            , S, T, U, V, W, X, Y, Z, a, b, c, d, e);
Packit Service 8bf002
Packit Service 8bf002
/* 37.3:    Significant initial characters in an internal identifier or a
Packit Service 8bf002
        macro name: at least 31.  */
Packit Service 8bf002
/*  ABCDEFGHIJKLMNOPQRSTUVWXYZabcd_ ;   */
Packit Service 8bf002
    ABCDEFGHIJKLMNOPQRSTUVWXYZabcd_;
Packit Service 8bf002
Packit Service 8bf002
/* 37.4:    Nested conditional inclusion: at least 8 levels.    */
Packit Service 8bf002
/*  nest = 8 ;  */
Packit Service 8bf002
#ifdef  A
Packit Service 8bf002
#else
Packit Service 8bf002
#   ifdef   B
Packit Service 8bf002
#   else
Packit Service 8bf002
#       ifdef   C
Packit Service 8bf002
#       else
Packit Service 8bf002
#           ifdef   D
Packit Service 8bf002
#           else
Packit Service 8bf002
#               ifdef   E
Packit Service 8bf002
#               else
Packit Service 8bf002
#                   ifdef   F
Packit Service 8bf002
#                   else
Packit Service 8bf002
#                       ifdef   G
Packit Service 8bf002
#                       else
Packit Service 8bf002
#                           ifdef   H
Packit Service 8bf002
#                           else
Packit Service 8bf002
                                nest = 8;
Packit Service 8bf002
#                           endif
Packit Service 8bf002
#                       endif
Packit Service 8bf002
#                   endif
Packit Service 8bf002
#               endif
Packit Service 8bf002
#           endif
Packit Service 8bf002
#       endif
Packit Service 8bf002
#   endif
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 37.5:    Nested source file inclusion: at least 8 levels.    */
Packit Service 8bf002
/*  nest = 1 ;  nest = 2 ;  nest = 3 ;  nest = 4 ;
Packit Service 8bf002
    nest = 5 ;  nest = 6 ;  nest = 7 ;  nest = 8 ;  */
Packit Service 8bf002
#define     X8
Packit Service 8bf002
#include    "nest1.h"
Packit Service 8bf002
Packit Service 8bf002
/* 37.6:    Parenthesized expression: at least 32 levels.   */
Packit Service 8bf002
/*  nest = 32 ; */
Packit Service 8bf002
#if     0 + (1 - (2 + (3 - (4 + (5 - (6 + (7 - (8 + (9 - (10 + (11 - (12 +  \
Packit Service 8bf002
        (13 - (14 + (15 - (16 + (17 - (18 + (19 - (20 + (21 - (22 + (23 -   \
Packit Service 8bf002
        (24 + (25 - (26 + (27 - (28 + (29 - (30 + (31 - (32 + 0))))))))))   \
Packit Service 8bf002
        )))))))))))))))))))))) == 0
Packit Service 8bf002
    nest = 32;
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* 37.7:    Characters in a string (after concatenation): at least 509. */
Packit Service 8bf002
"123456789012345678901234567890123456789012345678901234567890123456789\
Packit Service 8bf002
0123456789012345678901234567890123456789012345678901234567890123456789\
Packit Service 8bf002
0123456789012345678901234567890123456789012345678901234567890123456789\
Packit Service 8bf002
0123456789012345678901234567890123456789012345678901234567890123456789\
Packit Service 8bf002
0123456789012345678901234567890123456789012345678901234567890123456789\
Packit Service 8bf002
0123456789012345678901234567890123456789012345678901234567890123456789\
Packit Service 8bf002
0123456789012345678901234567890123456789012345678901234567890123456789\
Packit Service 8bf002
012345678901234567"
Packit Service 8bf002
        ;
Packit Service 8bf002
Packit Service 8bf002
/* 37.8:    Characters in a logical source line: at least 509.  */
Packit Service 8bf002
    int a123456789012345678901234567890 = 123450;   \
Packit Service 8bf002
    int b123456789012345678901234567890 = 123451;   \
Packit Service 8bf002
    int c123456789012345678901234567890 = 123452;   \
Packit Service 8bf002
    int d123456789012345678901234567890 = 123453;   \
Packit Service 8bf002
    int e123456789012345678901234567890 = 123454;   \
Packit Service 8bf002
    int f123456789012345678901234567890 = 123455;   \
Packit Service 8bf002
    int A123456789012345678901234567890 = 123456;   \
Packit Service 8bf002
    int B123456789012345678901234567890 = 123457;   \
Packit Service 8bf002
    int C123456789012345678901234567890 = 123458;   \
Packit Service 8bf002
    int D1234567890123456789012 = 123459;
Packit Service 8bf002
Packit Service 8bf002
/* 37.9:    Macro definitions: at least 1024.   */
Packit Service 8bf002
Packit Service 8bf002
#define X0400
Packit Service 8bf002
#include    "m4095.h"
Packit Service 8bf002
/*  0x0400; */
Packit Service 8bf002
    BNJ;
Packit Service 8bf002