Boost logo

Boost :

From: Paul Mensonides (pmenso57_at_[hidden])
Date: 2002-12-11 17:38:03


----- Original Message -----
From: "David Abrahams" <dave_at_[hidden]>

> David Abrahams <dave_at_[hidden]> 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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk