1 #version 450 2 3 // side test verifies multiple rounds of argument expansion 4 #define bear SecondExpansion 5 #define mmmB bear 6 #define mmmA(a) a 7 int mmmA(mmmB); // mmmB -> bear, and then in mmmA(), bear -> SecondExpansion 8 9 // pasting skips the first round of expansion 10 #define mmcatmmdog PostPasteExpansion 11 #define mmcat cat 12 #define mmdog dog 13 #define mmp(a,b) a## b 14 int mmp(mmcat, mmdog); // mmcat/mmdog not expanded, mmcatmmdog -> PostPasteExpansion 15 16 // multi-token pre 17 #define mmtokpastepre(a) a##27 18 mmtokpastepre(float foo); // should declare "float foo27;" 19 20 // multi-token post 21 #define mmtokpastepost(a) uni ##a 22 mmtokpastepost(form float foo155); // should declare "uniform float foo155;" 23 24 // non-first argument 25 #define foo ShouldntExpandToThis 26 #define semi ; 27 #define bothpaste(a,b) a##b 28 float bothpaste(foo, 719); // should declare "float foo719;" 29 #define secpaste(a,b) a bar ## b 30 secpaste(uniform float, foo semi) // should declare "uniform float barfoo;" 31 32 // no args 33 #define noArg fl##oat 34 noArg argless; 35 36 // bad location 37 #define bad1 ## float 38 bad1 dc1; 39 #define bad2 float ## 40 bad2 dc2; 41 42 // multiple ## 43 #define multiPaste(a, b, c) a##or##b flo##at foo##c 44 multiPaste(unif, m, 875); 45 46 // too long 47 #define simplePaste(a,b) a##b 48 // 1020 + 5 characters 49 float simplePaste(ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345, 12345); 50 51 // non-identifiers 52 int a = simplePaste(11,12); 53 54 // operators 55 #define MAKE_OP(L, R) L ## R 56 const int aop = 10; 57 const int bop = 4; 58 int cop = aop MAKE_OP(<, <) bop; 59 bool dop = aop MAKE_OP(!,=) bop; 60 61 #define MAKE_OP3(L, M, R) L ## M ## R 62 63 void foo() 64 { 65 int e = 16; 66 e MAKE_OP3(>,>,=) 2; 67 68 // recovery from bad op 69 bool f = e MAKE_OP(>,!) 5; 70 } 71 72 // arguments: should make 'uniform int argPaste2;' 73 #define M_NEST(q) int q 74 #define M_OUTER(p) M_NEST(p##2) 75 uniform M_OUTER(argPaste); 76 // should make 'uniform int argPaste20suff;' 77 #define M_NEST2(q) int q ## suff 78 #define M_OUTER2(p) M_NEST2(p ## 20) 79 uniform M_OUTER2(argPaste); 80 81 #define rec(x)## 82 rec(rec()) 83 84 #define bax(bay) 85 #define baz bax(/##) 86 baz 87