Boost logo

Boost :

From: Stephan Diederich (stephan.diederich_at_[hidden])
Date: 2008-04-09 20:05:00


On Wed, Apr 9, 2008 at 6:36 PM, Paul A Bristow <pbristow_at_[hidden]> wrote:
>
>
> >-----Original Message-----
> >From: boost-bounces_at_[hidden]
> >[mailto:boost-bounces_at_[hidden]] On Behalf Of Stephan Diederich
>
> >Sent: 09 April 2008 17:24
> >To: boost_at_[hidden]
>
>
> >Subject: Re: [boost] [1.35][lexical_cast][concept
> >check][range] Build errorandwarnings with MSVC8 on Warning Level 4
> >
> >> >As we tried to update to 1.35 today, we found some warnings
> >with MSVC
> >> >on Warning Level 4 in:
> >> >
> >> >lexical_cast:
> >> >There was a return statement after a call to throw_exception which
> >> >causes a unreachable code warning.
> >> >I can see no problem by just removing that return.
> >> >see http://svn.boost.org/trac/boost/ticket/1791
> >>
> >> The problem code is:
> >>
> >> throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
> >> return Target(); // normally never reached (throw_exception)
> >>
> >> Is the problem that the compiler can't be confident that
> >throw_exception won't ever return? (For that matter, can we?)
> >
> >Hm, I'm not sure what you mean. Do you think we exchange one warning
> >with another? "Code not reachable" with "Missing return value"?.
> >I think _we_ can be sure throw_exception does not return.
> >throw_exception doc ( http://tinyurl.com/4vup33 ) says that even the
> >user defined one is not allowed to return.
>
> Well it actually says
>
> "Callers of throw_exception are allowed to assume that the function never returns; therefore, if the user-defined throw_exception
> returns, the behavior is undefined."
>
> 'Undefined' is not quite the same as 'won't happen'.
>
> In the worst case, the result of excuting the return statement might be less worse ;-)
>
> So is it still safer to keep the return? One statement is quite cheap ;-)

I totally agree.

Would be nice to see the warning removed.

cheers,
stephan

> >> with a push'n'pop around this:
> >>
> >> #if (defined _MSC_VER)
> >> # pragma warning( push )
> >> # pragma warning( disable : 4702 ) : unreachable code
> >> #endif
> >>
> >> throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
> >> return Target(); // normally never reached (throw_exception)
> >>
> >> #if (defined _MSC_VER)
> >> # pragma warning( pop )
> >> #endif


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