I’ve reduced my problem to the following code snippet which compiles fine on GCC, but which fails to compile on MSVC (versions 9 and 10).  The error provided by MSVC is “fatal error C1012: unmatched parenthesis : missing ')'”.  It seems to have to do with the BOOST_PP_ITERATION_FLAGS() directive.  I’m using Boost 1.45.0.

 

Any thoughts on workarounds or bug-fixes? 

 

Thanks,

Rob Rumpf

 

 

#if !BOOST_PP_IS_ITERATING

#  ifndef __FILE_HPP__

#    define __FILE_HPP__

 

#    include <boost/preprocessor/iteration/iterate.hpp>

#    include <boost/preprocessor/seq/size.hpp>

#    include <boost/preprocessor/arithmetic/dec.hpp>

 

/// Set up the first (most outer) nested FOR loop.

#    define INDICES_1 (A)(B)

 

/// Set up the second (middle) nested FOR loop.

#    define INDICES_2 (C)(D)

 

/// Set up the third (inner) nested FOR loop (1 of 3).

#    define INDICES_3a (E)(F)

 

/// Set up the third (inner) nested FOR loop (2 of 3).

#    define INDICES_3b (G)(H)

 

/// Set up the third (inner) nested FOR loop (3 of 3).

#    define INDICES_3c (I)(J)

 

// Set up the number of iterations (see the Boost.Preprocessor library).

// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).

#    define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_1)), "file.hpp"))

 

// Iterate (see the Boost.Preprocessor library) on the first (most outer) nested FOR loop.

#    include BOOST_PP_ITERATE()

 

#  endif // __FILE_HPP__

// Choose the first iteration.

#elif BOOST_PP_ITERATION_DEPTH() == 1

 

// Set up the number of iterations (see the Boost.Preprocessor library).

// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).

#  define BOOST_PP_ITERATION_PARAMS_2 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_2)), "file.hpp"))

 

// Iterate (see the Boost.Preprocessor library) on the second (middle) nested FOR loop.

#  include BOOST_PP_ITERATE()

 

// Choose the second iteration.

#elif BOOST_PP_ITERATION_DEPTH() == 2

 

// Set up the number of iterations (see the Boost.Preprocessor library).

// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).

#  define BOOST_PP_ITERATION_PARAMS_3 (4, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_3a)), "file.hpp", 0))

 

// Iterate (see the Boost.Preprocessor library) on the third (inner) nested FOR loop (1 of 3).

#  include BOOST_PP_ITERATE()

 

// Set up the number of iterations (see the Boost.Preprocessor library).

// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).

#  define BOOST_PP_ITERATION_PARAMS_3 (4, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_3b)), "file.hpp", 1))

 

// Iterate (see the Boost.Preprocessor library) on the third (inner) nested FOR loop (2 of 3).

#  include BOOST_PP_ITERATE()

 

// Set up the number of iterations (see the Boost.Preprocessor library).

// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).

#  define BOOST_PP_ITERATION_PARAMS_3 (4, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_3c)), "file.hpp", 2))

 

// Iterate (see the Boost.Preprocessor library) on the third (inner) nested FOR loop (3 of 3).

#  include BOOST_PP_ITERATE()

 

// Look for the third nested loop, but index over INDICES_3a this time.

#elif BOOST_PP_ITERATION_DEPTH() == 3 && BOOST_PP_ITERATION_FLAGS() == 0

 

// Look for the third nested loop, but index over INDICES_3b this time.

#elif BOOST_PP_ITERATION_DEPTH() == 3 && BOOST_PP_ITERATION_FLAGS() == 1

 

// Look for the third nested loop, but index over INDICES_3c this time.

#elif BOOST_PP_ITERATION_DEPTH() == 3 && BOOST_PP_ITERATION_FLAGS() == 2

 

#endif // BOOST_PP_IS_ITERATING