Boost logo

Boost :

From: Mark Rodgers (mark.rodgers_at_[hidden])
Date: 2000-07-13 06:44:35


> These tricks work for GCC
> 2.95.2, but I've been unable to get them to work with MSVC6.
...
> I think there might be trouble with Borland, though.

Is it MSVC or STLport? I removed all the #ifdefs so that it
was using your new method always and I found:

1. It worked fine with both Borland compilers I use, and did
   indeed eliminate the warnings, although so does a simple
   #pragma warn -8012

2. MSVC didn't generate any warnings until I bumped the warning
   level up to 4, and then your change worked fine and did
   reduce the cast_test.cpp warnings from 55 down to 47.

3. It wouldn't work with GCC 2.95.2 at all due to a lack of
   <limits>

4. When I added the following test

    caught_exception = false;
    try { numeric_cast<unsigned
short>( std::numeric_limits<long>::max() ); }
    catch (bad_numeric_cast)
        { cout<<"caught bad_numeric_cast #6\n"; caught_exception = true; }
    if ( !caught_exception ) ++err_count;

   It failed (didn't throw). That's because I don't think the
   last test is correct:

    template <>
    struct greater_than_type_max<false>
    {
        template <class X, class Y>
        static bool check(X x, Y)
            { return x >= 0 && static_cast<X>(static_cast<Y>(x)) == x; }
    };

   This seems to be checking that it didn't overflow rather than
   that it would. So the following test also failed

    caught_exception = false;
    try { numeric_cast<unsigned
long>( std::numeric_limits<short>::max() ); }
    catch (bad_numeric_cast)
        { cout<<"caught bad_numeric_cast #7\n"; caught_exception = true; }
    if ( caught_exception ) ++err_count;

   (It threw and shouldn't have)

> Comments welcome!

I always think it is worthwhile to eliminate warnings by doing
the right thing rather than simply suppressing them with a
#pragma, so keep it up.

Mark


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