diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index 3fd98b8..43f5049 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -6,13 +6,11 @@ #include // placement new #ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4127) // conditional expression is constant -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Weffc++" +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) #endif #ifndef RAPIDJSON_NOMEMBERITERATORCLASS @@ -1168,12 +1166,8 @@ GenericValue::GenericValue(const GenericValue { } // namespace rapidjson #ifdef __GNUC__ -#pragma GCC diagnostic pop +RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_ENCODINGS_H_ diff --git a/include/rapidjson/prettywriter.h b/include/rapidjson/prettywriter.h index 5d04433..031f5de 100644 --- a/include/rapidjson/prettywriter.h +++ b/include/rapidjson/prettywriter.h @@ -4,8 +4,8 @@ #include "writer.h" #ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Weffc++" +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) #endif namespace rapidjson { @@ -184,7 +184,7 @@ private: } // namespace rapidjson #ifdef __GNUC__ -#pragma GCC diagnostic pop +RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/include/rapidjson/rapidjson.h b/include/rapidjson/rapidjson.h index bd500bc..0177b8c 100644 --- a/include/rapidjson/rapidjson.h +++ b/include/rapidjson/rapidjson.h @@ -156,9 +156,56 @@ template struct StaticAssertTest {}; // Helpers //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + #define RAPIDJSON_MULTILINEMACRO_BEGIN do { #define RAPIDJSON_MULTILINEMACRO_END \ } while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__clang__) || (defined(__GNUC__) && RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(__GNUC__) && RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + //!@endcond /////////////////////////////////////////////////////////////////////////////// diff --git a/test/perftest/perftest.h b/test/perftest/perftest.h index d142bee..86d53c6 100644 --- a/test/perftest/perftest.h +++ b/test/perftest/perftest.h @@ -29,14 +29,16 @@ # define __STDC_CONSTANT_MACROS 1 // required by C++ standard #endif -#ifdef __GNUC__ -#pragma GCC diagnostic push +#if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) #pragma GCC diagnostic ignored "-Weffc++" +#if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#pragma GCC diagnostic push +#endif #endif #include "gtest/gtest.h" -#ifdef __GNUC__ +#if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #pragma GCC diagnostic pop #endif diff --git a/test/perftest/rapidjsontest.cpp b/test/perftest/rapidjsontest.cpp index ea9d144..dd8bc30 100644 --- a/test/perftest/rapidjsontest.cpp +++ b/test/perftest/rapidjsontest.cpp @@ -172,8 +172,8 @@ TEST_F(RapidJson, DocumentTraverse) { } #ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Weffc++" +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) #endif struct ValueCounter : public BaseReaderHandler<> { @@ -186,7 +186,7 @@ struct ValueCounter : public BaseReaderHandler<> { }; #ifdef __GNUC__ -#pragma GCC diagnostic pop +RAPIDJSON_DIAG_POP #endif TEST_F(RapidJson, DocumentAccept) { diff --git a/test/unittest/readertest.cpp b/test/unittest/readertest.cpp index 62a0b42..494a9f2 100644 --- a/test/unittest/readertest.cpp +++ b/test/unittest/readertest.cpp @@ -6,8 +6,8 @@ using namespace rapidjson; #ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Weffc++" +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) #endif template @@ -707,5 +707,5 @@ TEST(Reader, Parse_IStreamWrapper_StringStream) { } #ifdef __GNUC__ -#pragma GCC diagnostic pop +RAPIDJSON_DIAG_POP #endif diff --git a/test/unittest/unittest.h b/test/unittest/unittest.h index 506203d..0fbe568 100644 --- a/test/unittest/unittest.h +++ b/test/unittest/unittest.h @@ -13,14 +13,16 @@ #pragma warning(disable : 4996) // 'function': was declared deprecated #endif -#ifdef __GNUC__ -#pragma GCC diagnostic push +#if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) #pragma GCC diagnostic ignored "-Weffc++" +#if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#pragma GCC diagnostic push +#endif #endif #include "gtest/gtest.h" -#ifdef __GNUC__ +#if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #pragma GCC diagnostic pop #endif