aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/validation/preprocessor3.c
blob: 71b9acdef0414af10e2fa90f4f9126e3da1a958a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
 * We get this one wrong too.
 *
 * It should result in a sequence
 *
 *	B ( )
 *	A ( )
 *	B ( )
 *	A ( )
 *
 * because each iteration of the scanning of "SCAN()"
 * should re-evaluate the recursive B->A->B expansion.
 * But we never re-evaluate something that we noticed
 * was recursive. So we will cause it to evaluate to
 *
 *	B ( )
 *	A ( )
 *	A ( )
 *	A ( )
 *
 * Which is really quite wrong.
 *
 * Did I already mention that the C preprocessor language
 * is a perverse thing?
 */

#define LP (

#define A() B LP )
#define B() A LP )

#define SCAN(x) x

A()                     // B ( )
SCAN( A() )             // A ( )
SCAN(SCAN( A() ))       // B ( )
SCAN(SCAN(SCAN( A() ))) // A ( )