diff options
| author | Michael Goulish <mgoulish@apache.org> | 2013-01-10 18:35:15 +0000 |
|---|---|---|
| committer | Michael Goulish <mgoulish@apache.org> | 2013-01-10 18:35:15 +0000 |
| commit | 4578b196e0338ccee7a2b78e95383dc618c01477 (patch) | |
| tree | 16662c62e313f3b5d146bfbe72dd1cc3e18bb192 /cpp | |
| parent | 948949560128d190871227fd1603cee41999cf2b (diff) | |
| download | qpid-python-4578b196e0338ccee7a2b78e95383dc618c01477.tar.gz | |
QPID-4531 : older GCC libs have error on negative-zero cast.
This is a real fix, a replacement for r1431435, which was
written by a crazy person.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1431548 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
| -rw-r--r-- | cpp/src/qpid/types/Variant.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/cpp/src/qpid/types/Variant.cpp b/cpp/src/qpid/types/Variant.cpp index 139ddc7ab4..8c9837e765 100644 --- a/cpp/src/qpid/types/Variant.cpp +++ b/cpp/src/qpid/types/Variant.cpp @@ -110,22 +110,28 @@ class VariantImpl } value; std::string encoding;//optional encoding for variable length data - template<class T> T convertFromString() const + template<class T> T convertFromString() const { const std::string& s = *value.string; try { - T r = boost::lexical_cast<T>(s); - //lexical_cast won't fail if string is a negative number and T is unsigned - //So check that and allow special case of negative zero - //else its a non-zero negative number so throw exception at end of function - if (std::numeric_limits<T>::is_signed || s.find('-') != 0 || r == 0) { - return r; + // Extra shenanigans to work around negative zero + // conversion error in older GCC libs. + if ( s[0] != '-' ) { + return boost::lexical_cast<T>(s); + } else { + T r = boost::lexical_cast<T>(s.substr(1)); + if (std::numeric_limits<T>::is_signed) { + return -r; + } else { + if (r==0) return 0; + } } } catch(const boost::bad_lexical_cast&) { } throw InvalidConversion(QPID_MSG("Cannot convert " << s)); } + }; |
