Subject: Re: [Boost-bugs] [Boost C++ Libraries] #4523: fix for #4501
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2010-09-19 18:14:33
#4523: fix for #4501
-----------------------------+----------------------------------------------
Reporter: ookami1@⦠| Owner: no-maintainer
Type: Patches | Status: new
Milestone: Boost 1.44.0 | Component: preprocessor
Version: Boost 1.44.0 | Severity: Problem
Resolution: | Keywords:
-----------------------------+----------------------------------------------
Comment (by ookami1@â¦):
The following patch allows BOOST_PP_FOR to run up to 256 iterations, one
more than 1.44 code does. This extension is nessecary to make a couple of
macros in preprocessor/seq expand successfully on sequences of maximum
length, and it brings BOOST_PP_FOR in line with BOOST_PP_LIMIT_FOR
indicating 256 successful iterations.
In a loop of n iterations, you need n loop control checks for each
iteration, and one final extra check to exit the loop. This last extra
check is not always provided for in the 1.44 BOOST_PP_FOR implementation.
If the loop count reaches 256, the maximum allowed, the 257-th cycle
expansion unconditionally results in an error, and, thus, omits the final
check.
The idea here is to run into an error only, if a final check indicates
continuation of the loop. As a consequence, the 257-th loop cycle
BOOST_PP_FOR_257 becomes a meaningful entry point into the loop, which in
turn requires an extension of BOOST_PP_AUTO_REC. The previous patch does
the nessecary modifications, and needs to be applied as well.
It would have had been nice, if indexing of loop iterations had started
with 0, so reserving the range 0 - 255 for successful iterations. It would
have meant, all indices were from the preprocessor integer range and would
have appeared in natural order. Unfortunately, it was once decided to
start with 1, and meanwhile there is code out there, that relies on this
fact.
In order to not break outside code, I decided to leave the indexing as is,
i.e running from 1 to 256, then index 257 assigned to the ultimate final
check cycle, and index 0 reserved for the unconditionally failing error
macro.
The proposed changes here should not affect code that runs successfully
under 1.44 code, as it extends BOOST_PP_FOR only. Code triggering errors
in BOOST_PP_FOR is likely to see different behavior, as previously failing
loops may now succeed, and error indices have been moved. I was unable to
locate an instance inside Boost itself, where this hurts.
The following code fails under the current 1.44 implementation, but will
run successfully after having the patches applied:
{{{
#include <boost/preprocessor.hpp>
#define P(r, s) s
#define O(r, s) BOOST_PP_DEC(s)
#define M(r, s) (s)
char const a[] = BOOST_PP_STRINGIZE(BOOST_PP_FOR(256, P, O, M));
int main()
{
printf("%s", a);
return 0;
}
}}}
Cheers
Wolf Lammen
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/4523#comment:4> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:04 UTC