[cfe-dev] Specific clang-cl preprocessor emulation problem

Edward Diener via cfe-dev cfe-dev at lists.llvm.org
Fri Apr 15 15:04:50 PDT 2016


I have reported bug 27380 located at 
https://llvm.org/bugs/show_bug.cgi?id=27380 for a clang-cl preprocessor 
problem as it emulates the VC++ preprocessor. The problem can be 
illustrated wit the code:

#define TEST_MACRO(x,y) TEST_EXPAND(2, 0, TEST_SOMETHING(x,y,1))
#define TEST_SOMETHING(x,y,z) 2

#define TEST_EXPAND(...) TEST_EXPAND_I(TEST_OVR(TEST_NAME, __VA_ARGS__), 
(__VA_ARGS__))
#define TEST_OVR(name,...) TEST_SOMENAME
#define TEST_EXPAND_I(m, args) TEST_EXPAND_II(m, args)
#define TEST_EXPAND_II(m, args) TEST_CAT(m ## args,)
#define TEST_SOMENAME(x,y,z) ;

#define TEST_CAT(a, b) TEST_CAT_I(a, b)
#define TEST_CAT_I(a, b) TEST_CAT_II(~, a ## b)
#define TEST_CAT_II(p, res) res

int main()
	{
	TEST_MACRO(1,2)
     }

which compiles correctly with VC++14 but with the latest clang-cl built 
from the trunk gives:

test_clang.cpp(17,2):  error: pasting formed 'TEST_SOMENAME(', an 
invalid preprocessing token [-Winvalid-token-paste]
         TEST_MACRO(1,2)
         ^
test_clang.cpp(2,25):  note: expanded from macro 'TEST_MACRO'
#define TEST_MACRO(x,y) TEST_EXPAND(2, 0, TEST_SOMETHING(x,y,1))
                         ^
test_clang.cpp(5,26):  note: expanded from macro 'TEST_EXPAND'
#define TEST_EXPAND(...) TEST_EXPAND_I(TEST_OVR(TEST_NAME, __VA_ARGS__), 
(__VA_ARGS__))
                          ^
test_clang.cpp(7,32):  note: expanded from macro 'TEST_EXPAND_I'
#define TEST_EXPAND_I(m, args) TEST_EXPAND_II(m, args)
                                ^
test_clang.cpp(8,44):  note: expanded from macro 'TEST_EXPAND_II'
#define TEST_EXPAND_II(m, args) TEST_CAT(m ## args,)

The bug is instrumental in keeping Boost PP from working correctly with 
clang-cl, and therefore keeping many other Boost libraries, which use 
Boost PP, from working with clang-cl. There appear to be other problems 
but until this gets fixed I won't know for sure, since fixing this 
problem may make any others which have shown up go away.

Thanks for listening !



More information about the cfe-dev mailing list