71 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
#version 450
 | 
						|
 | 
						|
// side test verifies multiple rounds of argument expansion
 | 
						|
#define bear SecondExpansion
 | 
						|
#define mmmB bear
 | 
						|
#define mmmA(a) a
 | 
						|
int mmmA(mmmB);                    // mmmB -> bear, and then in mmmA(), bear -> SecondExpansion
 | 
						|
 | 
						|
// pasting skips the first round of expansion
 | 
						|
#define mmcatmmdog PostPasteExpansion
 | 
						|
#define mmcat cat
 | 
						|
#define mmdog dog
 | 
						|
#define mmp(a,b) a## b
 | 
						|
int mmp(mmcat, mmdog);             // mmcat/mmdog not expanded, mmcatmmdog -> PostPasteExpansion
 | 
						|
 | 
						|
// multi-token pre
 | 
						|
#define mmtokpastepre(a) a##27
 | 
						|
mmtokpastepre(float foo);          // should declare "float foo27;"
 | 
						|
 | 
						|
// multi-token post
 | 
						|
#define mmtokpastepost(a) uni ##a
 | 
						|
mmtokpastepost(form float foo155); // should declare "uniform float foo155;"
 | 
						|
 | 
						|
// non-first argument
 | 
						|
#define foo ShouldntExpandToThis
 | 
						|
#define semi ;
 | 
						|
#define bothpaste(a,b) a##b
 | 
						|
float bothpaste(foo, 719);          // should declare "float foo719;"
 | 
						|
#define secpaste(a,b) a bar ## b
 | 
						|
secpaste(uniform float, foo semi)   // should declare "uniform float barfoo;"
 | 
						|
 | 
						|
// no args
 | 
						|
#define noArg fl##oat
 | 
						|
noArg argless;
 | 
						|
 | 
						|
// bad location
 | 
						|
#define bad1 ## float
 | 
						|
bad1 dc1;
 | 
						|
#define bad2 float ##
 | 
						|
bad2 dc2;
 | 
						|
 | 
						|
// multiple ##
 | 
						|
#define multiPaste(a, b, c) a##or##b flo##at foo##c
 | 
						|
multiPaste(unif, m, 875);
 | 
						|
 | 
						|
// too long
 | 
						|
#define simplePaste(a,b) a##b
 | 
						|
// 1020 + 5 characters
 | 
						|
float simplePaste(ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345, 12345);
 | 
						|
 | 
						|
// non-identifiers
 | 
						|
int a = simplePaste(11,12);
 | 
						|
 | 
						|
// operators
 | 
						|
#define MAKE_OP(L, R) L ## R
 | 
						|
const int aop = 10;
 | 
						|
const int bop = 4;
 | 
						|
int cop = aop MAKE_OP(<, <) bop;
 | 
						|
bool dop = aop MAKE_OP(!,=) bop;
 | 
						|
 | 
						|
#define MAKE_OP3(L, M, R) L ## M ## R
 | 
						|
 | 
						|
void foo()
 | 
						|
{
 | 
						|
    int e = 16;
 | 
						|
    e MAKE_OP3(>,>,=) 2;
 | 
						|
 | 
						|
    // recovery from bad op
 | 
						|
    bool f = e MAKE_OP(>,!) 5;
 | 
						|
}
 |