Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r56158 - trunk/boost
From: Alexander.Nasonov_at_[hidden]
Date: 2009-09-12 17:47:27


Author: nasonov
Date: 2009-09-12 17:47:27 EDT (Sat, 12 Sep 2009)
New Revision: 56158
URL: http://svn.boost.org/trac/boost/changeset/56158

Log:
Fix #1791 (fix warning on MSVC warning level 4) and undo r34801 (some "rewording" to avoid spurious level 4 warnings with VC7.1 and VC8).

Text files modified:
   trunk/boost/lexical_cast.hpp | 41 +++++++++++++++++++--------------------
   1 files changed, 20 insertions(+), 21 deletions(-)

Modified: trunk/boost/lexical_cast.hpp
==============================================================================
--- trunk/boost/lexical_cast.hpp (original)
+++ trunk/boost/lexical_cast.hpp 2009-09-12 17:47:27 EDT (Sat, 12 Sep 2009)
@@ -47,6 +47,13 @@
 #define BOOST_LCAST_NO_WCHAR_T
 #endif
 
+#ifdef BOOST_NO_TYPEID
+#define BOOST_LCAST_THROW_BAD_CAST(S, T) throw_exception(bad_lexical_cast())
+#else
+#define BOOST_LCAST_THROW_BAD_CAST(Source, Target) \
+ throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)))
+#endif
+
 namespace boost
 {
     // exception used to indicate runtime lexical_cast failure
@@ -1111,6 +1118,12 @@
             typedef const T * type;
         };
 
+#if (defined _MSC_VER)
+# pragma warning( push )
+# pragma warning( disable : 4701 ) // possible use of ... before initialization
+# pragma warning( disable : 4702 ) // unreachable code
+#endif
+
         template< typename Target
                 , typename Source
                 , bool Unlimited // string representation of Source is unlimited
@@ -1136,28 +1149,14 @@
               , detail::lexical_stream_limited_src<CharT,base,traits>
>::type interpreter(buf, buf + src_len);
 
- // The original form, reproduced below, is more elegant
- // but yields a spurious C4701 warning ("possible use of
- // "result" before initialization") with VC7.1 (/W4).
-//
-// Target result;
-//
-// if(!(interpreter << arg && interpreter >> result))
-// throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
-// return result;
-
- if(interpreter << arg) {
- Target result;
- if (interpreter >> result)
- return result;
- }
-#ifndef BOOST_NO_TYPEID
- throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
-#else
- throw_exception(bad_lexical_cast());
-#endif
- return Target(); // normally never reached (throw_exception)
+ Target result;
+ if(!(interpreter << arg && interpreter >> result))
+ BOOST_LCAST_THROW_BAD_CAST(Source, Target);
+ return result;
         }
+#if (defined _MSC_VER)
+# pragma warning( pop )
+#endif
     }
 
     template<typename Target, typename Source>


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk