----- Original Message -----
From: "David Abrahams" <[EMAIL PROTECTED]>


> David Abrahams <[EMAIL PROTECTED]> writes:
>
> > How can we say
> >
> >  #if BOOST_WORKAROUND(__SUNPRO_CC, /*something involving 0x530 */)
> >
> > and have it enter the #if and warn when __SUNPRO_CC > 0x530 ?
>
> It's supposed to enter the #if unconditionally, of course.

By "scaffolding" I meant "more lines."  It easy to cause it to error though:

#define BOOST_WORKAROUND(symbol, test) (((symbol) != 0) && 1 % ((symbol)
test ? 1 : 0))

#define SYMBOL 2

#if BOOST_WORKAROUND(SYMBOL, == 2) // okay
// ...

#if BOOST_WORKAROUND(SYMBOL, <= 1) // error
// ...

Causing a warning, on the other hand, is a QI issue.  It depends entirely on
whether you can find an expression that yields a warning.  For example, on
Comeau C++:

((symbol) test ? 1 : -1) * 1U

...causes a "change of sign" warning if "(symbol) test" yields false.
However, this doesn't work on at least some other compilers.  I tried all
sorts of things like shifting, UINT_MAX + 1, etc., but I didn't find
anything that issues a warning on VC (for example).

You could do something like this:

#if BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)

#if defined(BOOST_DEVELOPER_WARNINGS) && __SUNPRO_CC > 0x530
#pragma boost developer warning:  compiler version exceeded
#endif

// ...

#endif

Actually, given a known set of symbols (such as the ones used in config.hpp)
you don't need to separate the test from the symbol:

BOOST_WORKAROUND(__SUNPRO_CC <= 0x530)
                         // ^ no comma

As long as the symbols used are known, it is no problem to pull the symbol
off the beginning (or end) of the expression.

Paul Mensonides

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to