root/usr/src/tools/smatch/src/validation/preprocessor/preprocessor3.c
/*
 * Each iteration of the scanning of "SCAN()" re-evaluates the recursive
 * B->A->B expansion.
 *
 * 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 ( )
/*
 * check-name: Preprocessor #3
 * check-description: Sparse used to get this wrong, outputting A third, not B.
 * check-command: sparse -E $file
 *
 * check-output-start

B ( )
A ( )
B ( )
A ( )
 * check-output-end
 */