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