From 5b0610a74f8eee1209f18a7f4b0f706c84c424a4 Mon Sep 17 00:00:00 2001 From: Benjamin Lee Date: Wed, 6 Jun 2018 23:34:51 -0700 Subject: [PATCH] Handle non-throwing exception specifications that can still throw #1280 --- include/rapidjson/document.h | 9 +++++---- include/rapidjson/rapidjson.h | 13 +++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index d25c5c0..9acd86a 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -629,7 +629,7 @@ public: kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, kNumberAnyFlag }; - RAPIDJSON_ASSERT(type >= kNullType && type <= kNumberType); + RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType); data_.f.flags = defaultFlags[type]; // Use ShortString to store empty string. @@ -831,9 +831,10 @@ public: /*! \param rhs Source of the assignment. It will become a null value after assignment. */ GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { - RAPIDJSON_ASSERT(this != &rhs); - this->~GenericValue(); - RawAssign(rhs); + if (this != &rhs) { + this->~GenericValue(); + RawAssign(rhs); + } return *this; } diff --git a/include/rapidjson/rapidjson.h b/include/rapidjson/rapidjson.h index 9a476f6..0c575a7 100644 --- a/include/rapidjson/rapidjson.h +++ b/include/rapidjson/rapidjson.h @@ -591,6 +591,19 @@ RAPIDJSON_NAMESPACE_END //!@endcond +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NOEXCEPT_ASSERT + +#ifdef RAPIDJSON_ASSERT_THROWS +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT_ASSERT(x) +#else +#define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT +#else +#define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) +#endif // RAPIDJSON_ASSERT_THROWS + /////////////////////////////////////////////////////////////////////////////// // new/delete