From 3168d7c343c1bb55e9c93c052431c6d4c29ca797 Mon Sep 17 00:00:00 2001 From: Hendrik Muhs Date: Sun, 18 Apr 2021 18:06:35 +0200 Subject: [PATCH 1/3] add a test that provokes a compile time error on windows --- test/unittest/CMakeLists.txt | 1 + test/unittest/platformtest.cpp | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 test/unittest/platformtest.cpp diff --git a/test/unittest/CMakeLists.txt b/test/unittest/CMakeLists.txt index fc8803e..0a8f2a3 100644 --- a/test/unittest/CMakeLists.txt +++ b/test/unittest/CMakeLists.txt @@ -16,6 +16,7 @@ set(UNITTEST_SOURCES jsoncheckertest.cpp namespacetest.cpp pointertest.cpp + platformtest.cpp prettywritertest.cpp ostreamwrappertest.cpp readertest.cpp diff --git a/test/unittest/platformtest.cpp b/test/unittest/platformtest.cpp new file mode 100644 index 0000000..5f9f539 --- /dev/null +++ b/test/unittest/platformtest.cpp @@ -0,0 +1,37 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2021 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "unittest.h" + +// see https://github.com/Tencent/rapidjson/issues/1448 +// including windows.h on purpose to provoke a compile time problem as GetObject is a +// macro that gets defined when windows.h is included +#ifdef _WIN32 +#include +#endif + +#include "rapidjson/document.h" + +using namespace rapidjson; + +TEST(Platform, GetObject) { + Document doc; + doc.Parse(" { \"object\" : { \"pi\": 3.1416} } "); + EXPECT_TRUE(doc.IsObject()); + EXPECT_TRUE(doc.HasMember("object")); + const Document::ValueType& o = doc["object"]; + EXPECT_TRUE(o.IsObject()); + auto sub = o.GetObject(); + EXPECT_TRUE(sub.HasMember("pi")); +} From d179facf90043a6704554fac262ac2b7db0a484d Mon Sep 17 00:00:00 2001 From: Hendrik Muhs Date: Mon, 19 Apr 2021 12:29:11 -0700 Subject: [PATCH 2/3] don't let the GetObject macro rewrite the GetObject method, add a GetObj alias --- include/rapidjson/document.h | 16 ++++++++++++++++ test/unittest/platformtest.cpp | 3 +++ 2 files changed, 19 insertions(+) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index 54e2936..057b37a 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -42,6 +42,15 @@ RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible lo RAPIDJSON_DIAG_OFF(effc++) #endif // __GNUC__ +#ifdef GetObject +// see https://github.com/Tencent/rapidjson/issues/1448 +// a former included windows.h might have defined a macro called GetObject, which affects +// GetObject defined here. This ensures the macro does not get applied +#pragma push_macro("GetObject") +#define RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED +#undef GetObject +#endif + #ifndef RAPIDJSON_NOMEMBERITERATORCLASS #include // std::random_access_iterator_tag #endif @@ -1602,7 +1611,9 @@ public: } Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + Object GetObj() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + ConstObject GetObj() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } //@} @@ -3008,4 +3019,9 @@ private: RAPIDJSON_NAMESPACE_END RAPIDJSON_DIAG_POP +#ifdef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED +#pragma pop_macro("GetObject") +#undef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED +#endif + #endif // RAPIDJSON_DOCUMENT_H_ diff --git a/test/unittest/platformtest.cpp b/test/unittest/platformtest.cpp index 5f9f539..ec7abc3 100644 --- a/test/unittest/platformtest.cpp +++ b/test/unittest/platformtest.cpp @@ -22,6 +22,7 @@ #endif #include "rapidjson/document.h" +#undef GetObject using namespace rapidjson; @@ -34,4 +35,6 @@ TEST(Platform, GetObject) { EXPECT_TRUE(o.IsObject()); auto sub = o.GetObject(); EXPECT_TRUE(sub.HasMember("pi")); + auto sub2 = o.GetObj(); + EXPECT_TRUE(sub2.HasMember("pi")); } From 3cdfde14d682466b2ad550f1c47825a686a3db23 Mon Sep 17 00:00:00 2001 From: Hendrik Muhs Date: Mon, 19 Apr 2021 13:15:11 -0700 Subject: [PATCH 3/3] replace auto with concrete type --- test/unittest/platformtest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittest/platformtest.cpp b/test/unittest/platformtest.cpp index ec7abc3..05eba3f 100644 --- a/test/unittest/platformtest.cpp +++ b/test/unittest/platformtest.cpp @@ -33,8 +33,8 @@ TEST(Platform, GetObject) { EXPECT_TRUE(doc.HasMember("object")); const Document::ValueType& o = doc["object"]; EXPECT_TRUE(o.IsObject()); - auto sub = o.GetObject(); + Value::ConstObject sub = o.GetObject(); EXPECT_TRUE(sub.HasMember("pi")); - auto sub2 = o.GetObj(); + Value::ConstObject sub2 = o.GetObj(); EXPECT_TRUE(sub2.HasMember("pi")); }