[cfe-dev] Latest Windows build with VC++ 12 breaks preprocessor
Edward Diener
eldlistmailingz at tropicsoft.com
Mon Jul 7 23:19:32 PDT 2014
I am trying to test the latest build of clang using the VC++12 IDE with
Boost libraries. This build creates the version of clang executed as
clang-cl.exe.
I am actively involved with the Boost PP library. The tests for
preprocessor macros in this library are a good indication of correct
preprocessor macro expansion.
Previous versions of clang are able to pass all the tests. However the
latest version of clang-cl.exe for Windows fails one of the tests, so
some change made in the preprocessor is causing breakage. I will start
by giving the macro expansion that fails with a clang error. I do want
to first point out that not only previous versions of clang pass the
same tests but that all versions of gcc pass the tests and that the
particular failure of clang, when run under the Boost Wave preprocessor,
also expands the macro successfully. Since Boost PP is quite complicated
and uses largely very clever macro preprocessing implemented largely by
Paul Mensonides and on a lesser scale by myself, it is hard to pinpoint
why the latest clang in Windows using VC++ is failing the particular
macro expansion. Nonetheless the expansion which fails is:
# define SEQ_NONE ()
BOOST_PP_SEQ_TO_LIST(SEQ_NONE)
The expansion should create a Boost PP list of the form:
(,BOOST_PP_NIL)
which is a totally valid Boost PP list. Instead one gets from clang-cl.exe:
"..\..\..\boost/preprocessor/seq/to_list.hpp(22,59) : note: expanded
from macro 'BOOST_PP_SEQ_TO_LIST'
# define BOOST_PP_SEQ_TO_LIST(seq)
BOOST_PP_SEQ_TO_LIST_I(BOOST_PP_SEQ_BINARY_TRANSFORM(seq))
^
..\..\..\boost/preprocessor/seq/detail/binary_transform.hpp(29,61) :
note: expanded from macro 'BOOST_PP_SEQ_BINARY_TRANSFORM'
# define BOOST_PP_SEQ_BINARY_TRANSFORM(seq)
BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)
^
..\..\..\boost/preprocessor/seq/detail/binary_transform.hpp(39,114) :
note: expanded from macro 'BOOST_PP_SEQ_BINARY_TRANSFORM_A'
# define BOOST_PP_SEQ_BINARY_TRANSFORM_A(...)
(BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(__VA_ARGS__), __VA_ARGS__)()
BOOST_PP_SEQ_BINARY_TRANSFORM_B
^
..\..\..\boost/preprocessor/cat.hpp(22,47) : note: expanded from macro
'BOOST_PP_CAT'
# define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
^
..\..\..\boost/preprocessor/cat.hpp(29,34) : note: expanded from macro
'BOOST_PP_CAT_I'
# define BOOST_PP_CAT_I(a, b) a ## b
^
..\..\..\boost/preprocessor/seq/to_list.hpp(23,62) : note: expanded
from macro 'BOOST_PP_SEQ_TO_LIST_I'
# define BOOST_PP_SEQ_TO_LIST_I(bseq) BOOST_PP_SEQ_TO_LIST_A bseq
BOOST_PP_NIL BOOST_PP_SEQ_TO_LIST_B bseq
^
..\..\..\boost/preprocessor/seq/to_list.hpp(24,10) : note: macro
'BOOST_PP_SEQ_TO_LIST_A' defined here
# define BOOST_PP_SEQ_TO_LIST_A(m, e) m(BOOST_PP_LPAREN() e
BOOST_PP_COMMA() BOOST_PP_SEQ_TO_LIST_A_ID)
^
In file included from seq.cpp:14:
..\..\..\libs/preprocessor/test/seq.cxx(117,42) : error: too few
arguments provided to function-like macro invocation"
Meanwhile a Boost PP sequence which is not a single empty element works
correctly in clang, so that:
# define SEQ (4)(1)(5)(2)
BOOST_PP_SEQ_TO_LIST(SEQ)
correctly expands to:
(4,(1,(5,(2,BOOST_PP_NIL))))
I realize this is hard to describe in order to bring this to the
attention of clang developers, especially if they are not cognizant of
Boost or Boost PP, and I also realize I can create a bug report for
clang. But I thought I would try to describe it here in case whoever has
changed the macro expansion code in the preprocessor might realize that
whatever was changed has broken something in the preprocessor.
More information about the cfe-dev
mailing list