2016-12-19 19:19:43 +03:00
|
|
|
#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);
|
2016-12-21 22:32:56 +03:00
|
|
|
|
|
|
|
// 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;
|
|
|
|
}
|
2017-02-10 20:04:16 +03:00
|
|
|
|
|
|
|
// arguments: should make 'uniform int argPaste2;'
|
|
|
|
#define M_NEST(q) int q
|
|
|
|
#define M_OUTER(p) M_NEST(p##2)
|
|
|
|
uniform M_OUTER(argPaste);
|
|
|
|
// should make 'uniform int argPaste20suff;'
|
|
|
|
#define M_NEST2(q) int q ## suff
|
|
|
|
#define M_OUTER2(p) M_NEST2(p ## 20)
|
|
|
|
uniform M_OUTER2(argPaste);
|
2017-03-01 04:04:47 +03:00
|
|
|
|
|
|
|
#define rec(x)##
|
2017-04-04 21:28:20 +03:00
|
|
|
rec(rec())
|
|
|
|
|
|
|
|
#define bax(bay)
|
|
|
|
#define baz bax(/##)
|
|
|
|
baz
|