This is just for '\' that's not before a new line. Note the specification says it has no use other than as line continuation, but #error is a grey area. (There are no escape sequences.)
		
			
				
	
	
		
			343 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
#version 400
 | 
						|
 | 
						|
#define ON
 | 
						|
 | 
						|
float sum = 0.0;
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
 | 
						|
#ifdef ON
 | 
						|
//yes
 | 
						|
sum += 1.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef OFF
 | 
						|
//no
 | 
						|
sum += 20.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(ON)
 | 
						|
//yes
 | 
						|
sum += 300.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(OFF)
 | 
						|
//no
 | 
						|
sum += 4000.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#if !defined(ON)
 | 
						|
//no
 | 
						|
sum += 50000.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef OFF
 | 
						|
//yes
 | 
						|
sum += 600000.0;
 | 
						|
#else
 | 
						|
//no
 | 
						|
sum += 0.6;
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(ON) && defined(OFF)
 | 
						|
//no
 | 
						|
sum += 0.7;
 | 
						|
#elif !defined(OFF)
 | 
						|
//yes
 | 
						|
sum += 7000000.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(ON) && !defined(OFF)
 | 
						|
//yes
 | 
						|
sum += 80000000.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(OFF) || defined(ON)
 | 
						|
//yes
 | 
						|
sum += 900000000.0;
 | 
						|
#endif
 | 
						|
 | 
						|
#if NEVER_DEFINED
 | 
						|
//no
 | 
						|
sum += 0.04;
 | 
						|
#else
 | 
						|
sum += 0.05;
 | 
						|
#endif
 | 
						|
 | 
						|
// sum should be 987600301.7
 | 
						|
    gl_Position = vec4(sum);
 | 
						|
}
 | 
						|
 | 
						|
#define A 0
 | 
						|
# define B 0
 | 
						|
 #   define C 0
 | 
						|
 | 
						|
#if (A == B) || (A == C)
 | 
						|
#error good1
 | 
						|
#endif
 | 
						|
 | 
						|
#if A == B || (A == C)
 | 
						|
#error good2
 | 
						|
#endif
 | 
						|
 | 
						|
#if (A == B || (A == C))
 | 
						|
#error good3
 | 
						|
#endif
 | 
						|
 | 
						|
#if (AA == BB) || (AA == CC)
 | 
						|
#error good4
 | 
						|
#endif
 | 
						|
 | 
						|
#if AA == BB || (AA == CC)
 | 
						|
#error good5
 | 
						|
#endif
 | 
						|
 | 
						|
#if ((AA == BB || (AA == CC)))
 | 
						|
#error good6
 | 
						|
#endif
 | 
						|
 | 
						|
#if (A == B || (A == C)
 | 
						|
#error bad1
 | 
						|
#endif
 | 
						|
 | 
						|
#if A == B || A == C)
 | 
						|
#error bad2
 | 
						|
#endif
 | 
						|
 | 
						|
#if (A == B || (A == C)
 | 
						|
#error bad3
 | 
						|
#endif
 | 
						|
 | 
						|
#if AA == BB) || (AA == CC)
 | 
						|
#error bad4
 | 
						|
#endif
 | 
						|
 | 
						|
#if AA == BB || (AA == CC
 | 
						|
#error bad5
 | 
						|
#endif
 | 
						|
 | 
						|
#if ((AA == BB || (AA == CC))))
 | 
						|
#error bad6
 | 
						|
#endif extra tokens
 | 
						|
 | 
						|
int linenumber = __LINE__;
 | 
						|
int filenumber = __FILE__;
 | 
						|
int version = __VERSION__;
 | 
						|
 | 
						|
#define PI (3.14)
 | 
						|
#define TWOPI (2.0 * PI)
 | 
						|
float twoPi = TWOPI;
 | 
						|
 | 
						|
//#define PASTE(a,b) a ## b
 | 
						|
//float PASTE(tod, ay) = 17;
 | 
						|
 | 
						|
"boo" // ERROR
 | 
						|
int a = length("aoenatuh");  // ERROR
 | 
						|
#define QUOTE "abcd"  // okay
 | 
						|
'int';  // ERROR
 | 
						|
#define SINGLE 'a'   // okay
 | 
						|
// ERROR: all the following are reserved
 | 
						|
#define GL_
 | 
						|
#define GL_Macro 1
 | 
						|
#define __M 
 | 
						|
#define M__
 | 
						|
#define ABC__DE abc
 | 
						|
 | 
						|
#if 4
 | 
						|
#else extra
 | 
						|
#elif
 | 
						|
// ERROR elif after else
 | 
						|
#endif
 | 
						|
 | 
						|
#if blah
 | 
						|
  #if 0
 | 
						|
  #else extra
 | 
						|
    #ifdef M
 | 
						|
    #else
 | 
						|
    #else
 | 
						|
    // ERROR else after else
 | 
						|
    #endif  extra
 | 
						|
  #endif
 | 
						|
#endif
 | 
						|
 | 
						|
#define m1(a,a)  // ERROR
 | 
						|
#define m2(a,b)
 | 
						|
 | 
						|
// okay
 | 
						|
#define m3 (a)
 | 
						|
#define m3 (a)
 | 
						|
 | 
						|
// ERROR
 | 
						|
#define m4(b)
 | 
						|
#define m4 (b)
 | 
						|
 | 
						|
// ERROR
 | 
						|
#define m5 (b)
 | 
						|
#define m5(b)
 | 
						|
 | 
						|
// ERROR
 | 
						|
#define m6(a)
 | 
						|
#define m6
 | 
						|
 | 
						|
// ERROR (whitespace)
 | 
						|
#define m7 (a)
 | 
						|
#define m7 ( a)
 | 
						|
 | 
						|
#define m80(a,b) is + exactly m3 the same
 | 
						|
#define m80(a,b) is + exactly m3 the same
 | 
						|
 | 
						|
// ERROR
 | 
						|
#define m8(a,b) almost + exactly m3 the same
 | 
						|
#define m8(a,b) almost + exactly m3 thee same
 | 
						|
 | 
						|
// ERROR
 | 
						|
#define m9(a,b,c) aoe
 | 
						|
#define m9(a,d,c) aoe
 | 
						|
 | 
						|
#define n1 0xf
 | 
						|
int n = n1;
 | 
						|
 | 
						|
#define f1 .08e-2Lf
 | 
						|
double f = f1;
 | 
						|
 | 
						|
#undef __VERSION__
 | 
						|
#undef GL_ARB_texture_rectangle
 | 
						|
 | 
						|
#
 | 
						|
 # 
 | 
						|
		#	
 | 
						|
##
 | 
						|
# # 
 | 
						|
# 0x25
 | 
						|
####
 | 
						|
####ff
 | 
						|
#########ff fg 0x25
 | 
						|
#pragma
 | 
						|
#pragma(aoent)
 | 
						|
	#	pragma
 | 
						|
#pragma STDGL
 | 
						|
#pragma	 optimize(	on)
 | 
						|
#pragma  optimize(off)
 | 
						|
#pragma debug( on)
 | 
						|
#pragma debug(off	)
 | 
						|
#pragma	 optimize(	on) anoteun
 | 
						|
#pragma  optimize(off
 | 
						|
#pragma debug( on) (
 | 
						|
#pragma debug(off	aoeua)
 | 
						|
#pragma	 optimize(	on)
 | 
						|
#pragma  optimize(off,)
 | 
						|
#pragma debug( on, aoeu)
 | 
						|
#pragma debugoff	)
 | 
						|
#pragma aontheu natoeh uantheo uasotea noeahuonea uonethau onethuanoeth aunotehau noeth anthoeua  anoethuantoeh uantoehu natoehu naoteh unotaehu noethua onetuh aou
 | 
						|
# \
 | 
						|
 | 
						|
# \
 | 
						|
 error good continuation
 | 
						|
 | 
						|
#flizbit
 | 
						|
 | 
						|
#define directive error
 | 
						|
 | 
						|
#directive directive was expanded
 | 
						|
 | 
						|
#line 12000
 | 
						|
#error line should be 12000
 | 
						|
#line 13000 7
 | 
						|
#error line should be 13000, string 7
 | 
						|
#define L1 14000
 | 
						|
#define L2 13
 | 
						|
#define F1 5
 | 
						|
#define F2 7
 | 
						|
#line L1 + L2
 | 
						|
#error line should be 14013, string 7
 | 
						|
#line L1 + L2 F1 + F2 //  antoeuh sat  comment
 | 
						|
#error line should be 14013, string 12
 | 
						|
#line L1 + L2 + F1 + F2
 | 
						|
#error line should be 14025, string 12
 | 
						|
#line 1234 F1 + F2 extra
 | 
						|
#define empty_extra
 | 
						|
#line 1235 F1 + F2 empty_extra
 | 
						|
#define moreEmpty empty_extra
 | 
						|
#line 1236 F1 + F2 moreEmpty empty_extra // okay, lots of nothin
 | 
						|
#line 1237 F1 + F2 moreEmpty empty_extra extra  // ERROR, 'extra'
 | 
						|
#line 1238 F1 + F2 moreEmpty empty_extra
 | 
						|
#line 1239 empty_extra F1 empty_extra + empty_extra F2 empty_extra moreEmpty empty_extra
 | 
						|
#line (20000)
 | 
						|
#error line should be 20000
 | 
						|
#line (20000+10)
 | 
						|
#error line should be 20010
 | 
						|
#line +20020
 | 
						|
#error line should be 20020
 | 
						|
 | 
						|
#define VAL1 1.0
 | 
						|
#define VAL2 2.0
 | 
						|
 | 
						|
#define RES2 /* test a multiline
 | 
						|
                comment in a macro definition */ (RES1 * VAL2)
 | 
						|
#define RES1    (VAL2 / VAL1) 
 | 
						|
#define RES2    /* comment */(RES1 * VAL2)
 | 
						|
#define /* */SUM_VALUES   (RES2 + RES1)
 | 
						|
 | 
						|
void foo234()
 | 
						|
{
 | 
						|
    gl_Position = vec4(SUM_VALUES);
 | 
						|
}
 | 
						|
 | 
						|
// more whitespace recording tests
 | 
						|
#define SPACE_AT_END(a,b) spaceAtEndIsOkay
 | 
						|
#define SPACE_AT_END(a,b) spaceAtEndIsOkay // space at end
 | 
						|
 | 
						|
#define SPACE_AT_BEGIN(a,b)spaceAtBeginIsOkay
 | 
						|
#define SPACE_AT_BEGIN(a,b) spaceAtBeginIsOkay
 | 
						|
 | 
						|
// space in middle is an error
 | 
						|
#define SPACE_IN_MIDDLE(a,b) space +in middle
 | 
						|
#define SPACE_IN_MIDDLE(a,b) space + in middle
 | 
						|
 | 
						|
#define FIRSTPART 17
 | 
						|
#define SECONDPART + 5
 | 
						|
 | 
						|
#if FIRSTPART SECONDPART == 22
 | 
						|
#error good evaluation 1
 | 
						|
#endif
 | 
						|
 | 
						|
#if moreEmpty FIRSTPART moreEmpty SECONDPART moreEmpty == moreEmpty 22 moreEmpty
 | 
						|
#error good evaluation 2
 | 
						|
#endif
 | 
						|
 | 
						|
// ERRORS...
 | 
						|
#line 9000
 | 
						|
#if defined(OUNH
 | 
						|
#endif
 | 
						|
#if defined OUNH)
 | 
						|
#endif
 | 
						|
 | 
						|
// recursion (okay)
 | 
						|
#define RECURSE RECURSE
 | 
						|
int RECURSE;
 | 
						|
#define R2 R1
 | 
						|
#define R1 R2
 | 
						|
#undef RECURSE
 | 
						|
int R1 = RECURSE;
 | 
						|
 | 
						|
#define FOOOM(a,b) a + b
 | 
						|
int aoeua = FOOOM;
 | 
						|
#if FOOOM
 | 
						|
#endif
 | 
						|
 | 
						|
#line 9500
 | 
						|
#if\376
 | 
						|
#endif
 | 
						|
#if \376
 | 
						|
#endif
 | 
						|
#if \377
 | 
						|
#endif
 | 
						|
#error\377
 | 
						|
#error \ 376
 | 
						|
#error \377
 | 
						|
 | 
						|
#line 10000
 | 
						|
#if 1
 | 
						|
#else
 | 
						|
// ERROR, missing #endif |