Blame test-c/undefs.c

Packit Service 8bf002
/*
Packit Service 8bf002
 *  undefs.c:
Packit Service 8bf002
 * 1998/08          made public                                 kmatsui
Packit Service 8bf002
 * 2002/12          slightly revised                            kmatsui
Packit Service 8bf002
 * 2003/11          slightly revised                            kmatsui
Packit Service 8bf002
 *
Packit Service 8bf002
 *   Each of the following texts causes undefined behavior.  Good pre-
Packit Service 8bf002
 * processor will diagnose or warn at these texts, or at least document the
Packit Service 8bf002
 * behavior on these cases.
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
#include    <stdio.h>
Packit Service 8bf002
Packit Service 8bf002
#define str( a)     # a
Packit Service 8bf002
Packit Service 8bf002
main( void)
Packit Service 8bf002
{
Packit Service 8bf002
    int     a = 1, b = 2;
Packit Service 8bf002
    char *  string;
Packit Service 8bf002
Packit Service 8bf002
/* u.1.1:   End of a source file without <newline>. */
Packit Service 8bf002
#include    "unbal3.h"
Packit Service 8bf002
int e_1;
Packit Service 8bf002
Packit Service 8bf002
/* u.1.2:   End of a source file with <backslash><newline>. */
Packit Service 8bf002
#include    "unbal4.h"
Packit Service 8bf002
;
Packit Service 8bf002
Packit Service 8bf002
/* u.1.3:   End of a source file with an unterminated comment.  */
Packit Service 8bf002
#include    "unbal5.h"
Packit Service 8bf002
*/
Packit Service 8bf002
Packit Service 8bf002
/* u.1.4:   End of a source file with an uncompleted macro call.    */
Packit Service 8bf002
#include    "unbal6.h"
Packit Service 8bf002
    y);
Packit Service 8bf002
Packit Service 8bf002
/* u.1.5:   Illegal characters (in other than string literal, character
Packit Service 8bf002
        constant, header-name or comment).  */
Packit Service 8bf002
#if     1 ||?2?
Packit Service 8bf002
/*    0x01e ^ ^ 0x1f    */
Packit Service 8bf002
#endif  /* Maybe the second error.  */
Packit Service 8bf002
Packit Service 8bf002
/* u.1.6:   [VT], [FF] in directive line.   */
Packit Service 8bf002
#if     1 ||?2
Packit Service 8bf002
/*     [VT] ^ ^ [FF]    */
Packit Service 8bf002
#endif  /* Maybe the second error.  */
Packit Service 8bf002
Packit Service 8bf002
/* u.1.7:   Invalid multi-byte character sequence (in string literal,
Packit Service 8bf002
        character constant, header-name or comment).    */
Packit Service 8bf002
#if     'Ž== 0x8e
Packit Service 8bf002
/*       ^ 0x8e */
Packit Service 8bf002
#endif  /* Maybe the second error.  */
Packit Service 8bf002
Packit Service 8bf002
/* u.1.8:   Unterminated character constant.    */
Packit Service 8bf002
/*  The following "comment" may not interpreted as a comment but swallowed by
Packit Service 8bf002
        the unterminated character constant.    */
Packit Service 8bf002
#error  I can't understand. /* Token error prior to execution of #error.    */
Packit Service 8bf002
Packit Service 8bf002
/* u.1.9:   Unterminated string literal.    */
Packit Service 8bf002
    string =
Packit Service 8bf002
    "String literal
Packit Service 8bf002
    across the lines.
Packit Service 8bf002
"
Packit Service 8bf002
;
Packit Service 8bf002
Packit Service 8bf002
/* u.1.10:  Unterminated header-name.   */
Packit Service 8bf002
#include    
Packit Service 8bf002
Packit Service 8bf002
/* u.1.11:  Header-name containing ', ", \ or "/*". */
Packit Service 8bf002
/*  Probably illegal filename and fails to open.    */
Packit Service 8bf002
#include    "../*line.h"
Packit Service 8bf002
/*  \ is a legal path-delimiter in MS-DOS or some other OS's.   */
Packit Service 8bf002
#include    "..\test-c\line.h"
Packit Service 8bf002
Packit Service 8bf002
/* u.1.12:  Argument of #include other than header-name.    */
Packit Service 8bf002
#include    filename
Packit Service 8bf002
Packit Service 8bf002
/* u.1.13:  Excessive argument in #include directive.   */
Packit Service 8bf002
#include    <assert.h>  Junk
Packit Service 8bf002
Packit Service 8bf002
/* u.1.14:  #line directive without an argument of line number. */
Packit Service 8bf002
#line   "filename"
Packit Service 8bf002
Packit Service 8bf002
/* u.1.15:  #line directive with the second argument of other than string
Packit Service 8bf002
        literal.    */
Packit Service 8bf002
#line   1234    filename
Packit Service 8bf002
Packit Service 8bf002
/* u.1.16:  Excessive argument in #line directive.  */
Packit Service 8bf002
#line   2345    "filename"  Junk
Packit Service 8bf002
Packit Service 8bf002
/*  90, undefs.c or other undefined results.    */
Packit Service 8bf002
    printf( "%d, %s\n", __LINE__, __FILE__);
Packit Service 8bf002
Packit Service 8bf002
/* u.1.17:  Line number argument of #line directive should be in range of
Packit Service 8bf002
        [1,32767].  */
Packit Service 8bf002
#line   32767   /* valid here   */
Packit Service 8bf002
/* line 32767   */
Packit Service 8bf002
/* line 32768 ? : out of range  */
Packit Service 8bf002
    printf( "%d\n", __LINE__);
Packit Service 8bf002
                    /* 32769 ? or -32767 ?, maybe warned as an out-of-range */
Packit Service 8bf002
#line   0
Packit Service 8bf002
#line   32768
Packit Service 8bf002
Packit Service 8bf002
/* u.1.18:  Line number argument of #line directive should be written in
Packit Service 8bf002
        decimal digits. */
Packit Service 8bf002
#line   0x1000
Packit Service 8bf002
Packit Service 8bf002
#line   108     /* Restore to correct line number.  */
Packit Service 8bf002
Packit Service 8bf002
/* u.1.19:  A macro expanded to "defined" in #if expression.    */
Packit Service 8bf002
#define DEFINED     defined
Packit Service 8bf002
#if     DEFINED DEFINED
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
#undef  __linux__
Packit Service 8bf002
#undef  __arm__
Packit Service 8bf002
#define __linux__   1
Packit Service 8bf002
#define HAVE_MREMAP defined(__linux__) && !defined(__arm__)
Packit Service 8bf002
/* Wrong macro definition.
Packit Service 8bf002
 * This macro should be defined as follows.
Packit Service 8bf002
 *  #if defined(__linux__) && !defined(__arm__)
Packit Service 8bf002
 *  #define HAVE_MREMAP 1
Packit Service 8bf002
 *  #endif
Packit Service 8bf002
 */
Packit Service 8bf002
#if HAVE_MREMAP
Packit Service 8bf002
    mremap();
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* u.1.20:  Undefining __FILE__, __LINE__, __DATE__, __TIME__, __STDC__,
Packit Service 8bf002
        __STDC_VERSION__ or "defined" in #undef directive.  */
Packit Service 8bf002
#undef  __LINE__
Packit Service 8bf002
/*  131 or other undefined result.  */
Packit Service 8bf002
    printf( "%d\n", __LINE__);
Packit Service 8bf002
Packit Service 8bf002
/* u.1.21:  Defining __FILE__, __LINE__, __DATE__, __TIME__, __STDC__,
Packit Service 8bf002
        __STDC_VERSION__ or "defined" in #define directive. */
Packit Service 8bf002
#define __LINE__    1234
Packit Service 8bf002
/*  137 or other undefined result.  */
Packit Service 8bf002
    printf( "%d\n", __LINE__);
Packit Service 8bf002
#define defined     defined
Packit Service 8bf002
#if     defined defined
Packit Service 8bf002
#   error   I am not a good preprocessor.
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* u.1.22:  Result of ## operator is not a valid pp-token.  */
Packit Service 8bf002
#define NUM( dig, exp)  dig ## E+ ## exp
Packit Service 8bf002
/*
Packit Service 8bf002
 *   "E+" is a sequence of two pp-tokens "E" and "+", not a single pp-token.
Packit Service 8bf002
 * The first ## concatenates the last pp-token of first argument with "E",
Packit Service 8bf002
 * and the second ## concatenates "+" with the first pp-token of the second
Packit Service 8bf002
 * argument.
Packit Service 8bf002
 *   While "12E" (one of the sequence generated by the token concatenation)
Packit Service 8bf002
 * is a valid pp-token, "+34" (the another sequence) is not a valid pp-token
Packit Service 8bf002
 * and causes an undefined behavior.
Packit Service 8bf002
 */
Packit Service 8bf002
    printf( "%e\n", NUM( 12, 34));
Packit Service 8bf002
Packit Service 8bf002
/* u.1.23:  Result of # operator is not a valid string literal. */
Packit Service 8bf002
/*  "\\"\"";    This sequence is parsed to three tokens "\\" \ "", and will be
Packit Service 8bf002
        diagnosed by compiler-proper unless diagnosed by preprocessor.  */
Packit Service 8bf002
    puts( str( \""));
Packit Service 8bf002
Packit Service 8bf002
/* u.1.24:  Empty argument of macro call.   */
Packit Service 8bf002
/*
Packit Service 8bf002
 *   Note: Since no argument and one empty argument cannot be distinguished
Packit Service 8bf002
 * syntactically, additional dummy argument may be necessary for an
Packit Service 8bf002
 * intermediate macro to process one empty argument (if possible).
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
#define ARG( a, dummy)      # a
Packit Service 8bf002
#define EMPTY
Packit Service 8bf002
#define SHOWN( n)       printf( "%s : %d\n", # n, n)
Packit Service 8bf002
#define SHOWS( s)       printf( "%s : %s\n", # s, ARG( s, dummy))
Packit Service 8bf002
#define add( a, b)      (a + b)
Packit Service 8bf002
#define sub( a, b)      (a - b)
Packit Service 8bf002
#define math( op, a, b)     op( a, b)
Packit Service 8bf002
#define APPEND( a, b)       a ## b
Packit Service 8bf002
Packit Service 8bf002
/*  printf( "%s : %d\n", "math( sub, , y)", ( - y));
Packit Service 8bf002
        or other undefined behavior.    */
Packit Service 8bf002
    SHOWN( math( sub, , y));
Packit Service 8bf002
Packit Service 8bf002
/*  printf( "%s : %s\n", "EMPTY", "");
Packit Service 8bf002
        or other undefined behavior.    */
Packit Service 8bf002
    SHOWS( EMPTY);
Packit Service 8bf002
Packit Service 8bf002
/*  printf( "%s : %s\n", "APPEND( CON, 1)", "CON1");    */
Packit Service 8bf002
    SHOWS( APPEND( CON, 1));
Packit Service 8bf002
Packit Service 8bf002
/*  printf( "%s : %s\n", "APPEND( CON, )", "CON");
Packit Service 8bf002
        or other undefined behavior.    */
Packit Service 8bf002
    SHOWS( APPEND( CON, ));
Packit Service 8bf002
Packit Service 8bf002
/*  printf( "%s : %s\n", "APPEND( , )", "");
Packit Service 8bf002
        or other undefined behavior.    */
Packit Service 8bf002
    SHOWS( APPEND( , ));
Packit Service 8bf002
Packit Service 8bf002
/* u.1.25:  Macro argument otherwise parsed as a directive. */
Packit Service 8bf002
/*  "#define NAME"; or other undefined behaviour.   */
Packit Service 8bf002
    puts( str(
Packit Service 8bf002
#define NAME
Packit Service 8bf002
    ));
Packit Service 8bf002
Packit Service 8bf002
#define sub( x, y)      (x - y)
Packit Service 8bf002
#define SUB             sub
Packit Service 8bf002
Packit Service 8bf002
#if 0   /* Added by C90: Corrigendum 1 (1994) and deleted by C99    */
Packit Service 8bf002
/* u.1.26:  Expanded macro replacement list end with name of function-like
Packit Service 8bf002
        macro.  */
Packit Service 8bf002
    SUB( a, b);
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* u.1.27:  Unknown preprocessing directive (other than #pragma).   */
Packit Service 8bf002
#ifdefined MACRO
Packit Service 8bf002
#endif              /* The second error.    */
Packit Service 8bf002
Packit Service 8bf002
#define D   define
Packit Service 8bf002
/* u.1.28:  There are following two ways of preprocessing.
Packit Service 8bf002
    1:  "D" isn't expanded, because # is the first token of the line.
Packit Service 8bf002
        Preprocessor reports that "D" is an unknown directive.
Packit Service 8bf002
    2:  "D" is expanded, because that is not a directive.
Packit Service 8bf002
        Compiler-phase will diagnose the output of preprocess.
Packit Service 8bf002
    Anyway, preprocessor should not interprete this line as a preprocessing
Packit Service 8bf002
    directive.
Packit Service 8bf002
 */
Packit Service 8bf002
#D  A   B
Packit Service 8bf002
Packit Service 8bf002
/* u.2.1:   Undefined escape sequence.  */
Packit Service 8bf002
#if     '\x'
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/* u.2.2:   Illegal bit shift count.    */
Packit Service 8bf002
#if     1 << -1
Packit Service 8bf002
#endif
Packit Service 8bf002
#if     1 << 64
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
    return  0;
Packit Service 8bf002
}
Packit Service 8bf002