$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [accumulators] broken on msvc
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2014-06-15 17:20:52
On Sunday 15 June 2014 21:18:12 Jürgen Hunold wrote:
> Am Sonntag, 15. Juni 2014, 20:23:43 schrieb Andrey Semashev:
> > On Sun, Jun 15, 2014 at 8:03 PM, Jürgen Hunold <jhunold_at_gmx.eu> wrote:
> > > My own code broke with an identical message sometime last week.
> > > Any ideas?
> > 
> > I think there's a missing #include <boost/preprocessor/cat.hpp> in
> > boost/accumulators/accumulators_fwd.hpp. There is another use of
> > BOOST_PP_CAT in boost/accumulators/numeric/detail/function_n.hpp but
> > it has the #include. I don't see how this could be related to
> > boost/accumulators/framework/accumulators/reference_accumulator.hpp
> > though.
> 
> As there are no changes in accumulators I've trace the bug back to
> 
> preprocessor. Bisecting the error leads to:
> > c66ea5871fd44274f681f02323c4d46bdf394c7c is the first bad commit
> > commit c66ea5871fd44274f681f02323c4d46bdf394c7c
> > Author: Edward Diener <eldiener_at_[hidden]>
> > Date:   Wed Apr 30 16:06:49 2014 -0400
> > 
> >     Addition of is_empty tests and changes to rem processing as a
> >     workaround
> >     to VC++ problem.
> 
> the culprit might be this change, which moves cat.hpp out of scope for msvc:
> 
> diff --git a/include/boost/preprocessor/facilities/is_empty.hpp
> b/include/boost/preprocessor/facilities/is_empty.hpp
> index b1094d8..e7f821f 100644
> --- a/include/boost/preprocessor/facilities/is_empty.hpp
> +++ b/include/boost/preprocessor/facilities/is_empty.hpp
> @@ -22,10 +22,13 @@
>  # else
>  #
>  # include <boost/preprocessor/config/config.hpp>
> -# include <boost/preprocessor/cat.hpp>
> +# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() &&
> ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
>  # include <boost/preprocessor/tuple/elem.hpp>
>  # include <boost/preprocessor/facilities/empty.hpp>
> +# else
> +# include <boost/preprocessor/cat.hpp>
>  # include <boost/preprocessor/detail/split.hpp>
> +# endif
>  #
>  # /* BOOST_PP_IS_EMPTY */
>  #
> 
> The question remains: Who fixes this where?
As far as I can see, is_empty.hpp does not use BOOST_PP_CAT when it doesn't 
include it, so the header is correct. Accumulators should include cat.hpp 
whenever it uses BOOST_PP_CAT, so at least accumulators_fwd.hpp has a bug.