vkd3d/tests/preproc-macro.shader_test

382 lines
4.5 KiB
Plaintext

[preproc]
#define KEY pass
KEY
[preproc]
#define KEY fail
pass
[preproc]
#define KEY(a, b) a
KEY(pass, fail)
[preproc]
/* Make sure argument expansion replaces the right tokens. */
#define KEY(pass, fail) fail
KEY(fail, pass)
[preproc]
#define KEY (pass)
KEY(a,b)
[preproc]
#define FUNC(a) pass
#define LEFT FUNC(
LEFT fail)
[preproc]
#define KEY(a, b) a
KEY(
pass
,
fail
)
[preproc]
/* Function-like macros which cannot be expanded (due to argument count mismatch
* or other parse errors) emit only the macro name and nothing else. In the case
* of unterminated macro lists, nothing after the macro name is emitted. */
#define pass(a, b) a b fail
pass(fail, fail
fail
[preproc]
#define pass(a, b) fail
pass(fail, fail, fail)
[preproc]
#define KEY(a, b) fail
KEY(fail, fail, fail)
pass
[preproc]
#define pass(a, b) fail
pass
(a, b)
[preproc]
#define FUNC(a) pass
#define KEY FUNC
KEY (fail)
[preproc]
#define KEY(a, b) a ## b
KEY ( pa , ss )
[preproc]
#define KEY(a, b) pa ## ss
KEY(fail, fail)
[preproc]
#define KEY(a) a ## ss
KEY(pa)
[preproc]
#define KEY(a) pa ## a
KEY(ss)
[preproc]
#define KEY(x) p \
## \
x \
## \
ss
KEY(
a
)
[preproc]
/* Concatenation is only parsed if the macro has arguments. */
#define KEY fa ## il
KEY pass
[preproc]
#define KEY(a) a
KEY(pa ## ss)
[preproc]
fa ## il
pass
[preproc]
#define KEY1 KEY2
#define KEY2 pass
KEY1
[preproc]
#define KEY2 pass
#define KEY1 KEY2
KEY1
[preproc]
#define KEY fail
#undef KEY
KEY pass
[preproc]
#define KEY(a,b) fail
#undef KEY
KEY(pass, pass)
[preproc]
#define KEY1 KEY2
#define KEY2 fail
#undef KEY2
KEY1 pass
[preproc]
#define KEY2 fail
#define KEY1 KEY2
#undef KEY2
KEY1 pass
[preproc]
#define KEY1(a, b) a
#define KEY2 pass
#define KEY3 fail
KEY1(KEY2, KEY3)
[preproc]
#define a b
#define KEY(a) b
KEY(fail)
pass
[preproc]
#define a b
#define KEY(a) a
KEY(pass)
[preproc]
#define OP==
#if 2 OP 3
fail
#elif 2 OP 2
pass
#endif
[preproc]
#define KEY 1
#if KEY == 1
pass
#endif
[preproc]
#define KEY(a, b) (a < b)
#if KEY(2, 1)
fail
#elif KEY(1, 2)
pass
#endif
[preproc]
#define KEY fail
#define KEY pass
KEY
[preproc]
/* Identifiers are not expanded in the LHS of #define statements. */
#define KEY pass
#define KEY fail
pass
[preproc]
#undef KEY
pass
[preproc]
#define KEY(a, b) b
KEY("fail,fail",pass)
[preproc]
#define \
KEY( \
a \
, \
b \
) \
a
KEY(pass, fail)
[preproc]
#define \
KEY \
pass
KEY
[preproc]
#define KEY(a, b) b
KEY(multiline
argument,pass)
[preproc]
#define KEY(a, b) b
KEY(
multiline
#define fail pass
argument, fail)
[preproc]
#define KEY(a, b) a
KEY((pass,pass),(fail,fail))
[preproc]
#define KEY(a, b) b
KEY((,,fail,,fail,,),(,,pass,,pass,,))
[preproc]
#define KEY(a, b) b
KEY([,,fail,,fail,,],[,,pass,,pass,,])
[preproc]
#define KEY(a, b) b
KEY({,,fail,,fail,,},{,,pass,,pass,,})
[preproc]
#define KEY(a, b) pass
KEY((),())
[preproc]
#define KEY(a, b) pass
KEY((,),(,))
[preproc]
/* Unbalanced parentheses result in an unterminated macro. */
#define pass(a, b) fail
pass((),()
[preproc]
#define KEY(a,a) a
KEY(pass,fail)
[preproc]
/* Macro arguments suffer their own macro expansion only after the macro has
* been completely parsed. */
#define KEY(a) a
KEY(fail
#define fail pass
)
[preproc]
/* The same applies to #if. */
#define KEY(a) a
KEY(
#define OBJ
#ifdef OBJ
pass
#endif
)
[preproc]
#define KEY(a) a
KEY(pass
#ifdef OBJ
fail
#endif
#define OBJ
)
[preproc]
/* Directives inside of macro arguments are always evaluated. */
#define FUNC(a) value
FUNC(fail
#define KEY pass
)
KEY
[preproc]
#define FUNC1(a) a ## ss
#define FUNC2(a, b) a < b
FUNC1(
#if FUNC2(3, 2)
fail
#elif FUNC2(2, 3)
pa
#else
fail
#endif
)
[preproc]
#define __LINE__ pass
__LINE__
[preproc]
#define KEY pass
apple # KEY
[preproc]
#define KEY2(x) x ## ss
#define KEY(a) KEY2(a)
KEY(pa)
[preproc]
#define KEY2(x) x
#define KEY KEY2(fa il)
KEY
pass
[preproc]
#define Key1::Key2 pass
Key1::Key2
[preproc]
#define ::Key pass
::Key
[preproc]
#define Key1::Key2(x) pass
Key1::Key2(fail)
[preproc]
#define Key1::Key2::Key3 pass
Key1::Key2::Key3
[preproc]
#define Key1:pass value
Key1:pass
[preproc]
#define Key1::::pass value
Key1::::pass
[preproc]
#define fail:: pass
fail
[preproc]
#define pass bar
#define key::bar fail
key::pass
[preproc]
#define pass bar
#define bar::key fail
pass::key
[preproc]
#define fail::1KEY pass
fail::1KEY
[preproc]
#define::pass value
::pass
[preproc]
#define fail(key1::key2) key1::key2
fail(pass)
[preproc]
#define key1:: key2 pass
key1
[preproc]
#define key1 ::key2 pass
key1
[preproc]
#define KEY(a, b) a b
KEY(KEY(x, y), pass)