From 8cae9d7cd2ba63f3147c0d12a0dd510c82a92d4a Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 17 Aug 2021 14:43:43 +0200 Subject: [PATCH] Overwork warning flags (#2936) * :alembic: update warning flags --- cmake/ci.cmake | 31 ++++++++++++++++--- doc/mkdocs/docs/api/basic_json/binary_t.md | 2 +- .../docs/api/basic_json/cbor_tag_handler_t.md | 2 +- .../nlohmann/byte_container_with_subtype.hpp | 4 +-- include/nlohmann/detail/macro_scope.hpp | 5 +-- include/nlohmann/detail/macro_unscope.hpp | 4 +-- single_include/nlohmann/json.hpp | 13 ++++---- test/src/unit-assert_macro.cpp | 14 ++++++--- test/src/unit-conversions.cpp | 6 ++++ test/src/unit-disabled_exceptions.cpp | 6 ++++ test/src/unit-items.cpp | 9 ++++++ test/src/unit-json_pointer.cpp | 12 +++---- test/src/unit-noexcept.cpp | 6 ++++ test/src/unit-readme.cpp | 11 +++---- test/src/unit-regression2.cpp | 6 ++++ test/src/unit-udt.cpp | 6 ++++ test/src/unit-unicode2.cpp | 6 ++++ test/src/unit-unicode3.cpp | 6 ++++ test/src/unit-unicode4.cpp | 6 ++++ test/src/unit-unicode5.cpp | 6 ++++ 20 files changed, 123 insertions(+), 38 deletions(-) diff --git a/cmake/ci.cmake b/cmake/ci.cmake index 2bcdd0062..3ae527b35 100644 --- a/cmake/ci.cmake +++ b/cmake/ci.cmake @@ -88,21 +88,36 @@ file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp) # Thorough check with recent compilers ############################################################################### +# Ignored Clang warnings: +# -Wno-c++98-compat The library targets C++11. +# -Wno-c++98-compat-pedantic The library targets C++11. +# -Wno-deprecated-declarations The library contains annotations for deprecated functions. +# -Wno-extra-semi-stmt The library uses std::assert which triggers this warning. +# -Wno-padded We do not care about padding warnings. +# -Wno-covered-switch-default All switches list all cases and a default case. +# -Wno-weak-vtables The library is header-only. + set(CLANG_CXXFLAGS "-std=c++11 \ -Werror \ -Weverything \ -Wno-c++98-compat \ -Wno-c++98-compat-pedantic \ -Wno-deprecated-declarations \ - -Wno-documentation-unknown-command \ - -Wno-exit-time-destructors \ -Wno-extra-semi-stmt \ -Wno-padded \ - -Wno-range-loop-analysis \ -Wno-covered-switch-default \ -Wno-weak-vtables \ ") +# Ignored GCC warnings: +# -Wno-abi-tag We do not care about ABI tags. +# -Wno-aggregate-return The library uses aggregate returns. +# -Wno-long-long The library uses the long long type to interface with system functions. +# -Wno-namespaces The library uses namespaces. +# -Wno-padded We do not care about padding warnings. +# -Wno-system-headers We do not care about warnings in system headers. +# -Wno-templates The library uses templates. + set(GCC_CXXFLAGS "-std=c++11 \ -pedantic \ -Werror \ @@ -203,10 +218,16 @@ set(GCC_CXXFLAGS "-std=c++11 \ -Wextra-semi \ -Wfloat-conversion \ -Wfloat-equal \ + -Wformat-contains-nul \ -Wformat-diag \ + -Wformat-extra-args \ + -Wformat-nonliteral \ -Wformat-overflow=2 \ + -Wformat-security \ -Wformat-signedness \ -Wformat-truncation=2 \ + -Wformat-y2k \ + -Wformat-zero-length \ -Wformat=2 \ -Wframe-address \ -Wfree-nonheap-object \ @@ -249,7 +270,7 @@ set(GCC_CXXFLAGS "-std=c++11 \ -Wmultistatement-macros \ -Wno-namespaces \ -Wnarrowing \ - -Wno-noexcept \ + -Wnoexcept \ -Wnoexcept-type \ -Wnon-template-friend \ -Wnon-virtual-dtor \ @@ -277,7 +298,7 @@ set(GCC_CXXFLAGS "-std=c++11 \ -Wpragmas \ -Wprio-ctor-dtor \ -Wpsabi \ - -Wno-range-loop-construct \ + -Wrange-loop-construct \ -Wredundant-decls \ -Wredundant-move \ -Wredundant-tags \ diff --git a/doc/mkdocs/docs/api/basic_json/binary_t.md b/doc/mkdocs/docs/api/basic_json/binary_t.md index 0dd859dcc..f7da1ece0 100644 --- a/doc/mkdocs/docs/api/basic_json/binary_t.md +++ b/doc/mkdocs/docs/api/basic_json/binary_t.md @@ -64,4 +64,4 @@ type `#!cpp binary_t*` must be dereferenced. ## Version history -- Added in version 3.8.0. Changed type of subtype to `std::uint64_t` in version 3.9.2. +- Added in version 3.8.0. Changed type of subtype to `std::uint64_t` in version 3.10.0. diff --git a/doc/mkdocs/docs/api/basic_json/cbor_tag_handler_t.md b/doc/mkdocs/docs/api/basic_json/cbor_tag_handler_t.md index 928115718..7073b9d7d 100644 --- a/doc/mkdocs/docs/api/basic_json/cbor_tag_handler_t.md +++ b/doc/mkdocs/docs/api/basic_json/cbor_tag_handler_t.md @@ -22,4 +22,4 @@ store ## Version history -- Added in version 3.9.0. Added value `store` in 3.9.2. +- Added in version 3.9.0. Added value `store` in 3.10.0. diff --git a/include/nlohmann/byte_container_with_subtype.hpp b/include/nlohmann/byte_container_with_subtype.hpp index 0c117bff5..4086e0834 100644 --- a/include/nlohmann/byte_container_with_subtype.hpp +++ b/include/nlohmann/byte_container_with_subtype.hpp @@ -18,7 +18,7 @@ order to override the binary type. @tparam BinaryType container to store bytes (`std::vector` by default) -@since version 3.8.0; changed type of subtypes to std::uint64_t in 3.9.2. +@since version 3.8.0; changed type of subtypes to std::uint64_t in 3.10.0. */ template class byte_container_with_subtype : public BinaryType @@ -108,7 +108,7 @@ class byte_container_with_subtype : public BinaryType subtype @since version 3.8.0; fixed return value to properly return - subtype_type(-1) as documented in version 3.9.2 + subtype_type(-1) as documented in version 3.10.0 */ constexpr subtype_type subtype() const noexcept { diff --git a/include/nlohmann/detail/macro_scope.hpp b/include/nlohmann/detail/macro_scope.hpp index 663c2fbd3..400530a60 100644 --- a/include/nlohmann/detail/macro_scope.hpp +++ b/include/nlohmann/detail/macro_scope.hpp @@ -38,8 +38,9 @@ // disable documentation warnings on clang #if defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" #endif // allow to disable exceptions diff --git a/include/nlohmann/detail/macro_unscope.hpp b/include/nlohmann/detail/macro_unscope.hpp index 28be047aa..3f56e4b85 100644 --- a/include/nlohmann/detail/macro_unscope.hpp +++ b/include/nlohmann/detail/macro_unscope.hpp @@ -1,8 +1,8 @@ #pragma once -// restore GCC/clang diagnostic settings +// restore clang diagnostic settings #if defined(__clang__) - #pragma GCC diagnostic pop + #pragma clang diagnostic pop #endif // clean up diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 16afb8a6a..7a65b5fb6 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -2250,8 +2250,9 @@ JSON_HEDLEY_DIAGNOSTIC_POP // disable documentation warnings on clang #if defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" #endif // allow to disable exceptions @@ -5003,7 +5004,7 @@ order to override the binary type. @tparam BinaryType container to store bytes (`std::vector` by default) -@since version 3.8.0; changed type of subtypes to std::uint64_t in 3.9.2. +@since version 3.8.0; changed type of subtypes to std::uint64_t in 3.10.0. */ template class byte_container_with_subtype : public BinaryType @@ -5093,7 +5094,7 @@ class byte_container_with_subtype : public BinaryType subtype @since version 3.8.0; fixed return value to properly return - subtype_type(-1) as documented in version 3.9.2 + subtype_type(-1) as documented in version 3.10.0 */ constexpr subtype_type subtype() const noexcept { @@ -26423,9 +26424,9 @@ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std // #include -// restore GCC/clang diagnostic settings +// restore clang diagnostic settings #if defined(__clang__) - #pragma GCC diagnostic pop + #pragma clang diagnostic pop #endif // clean up diff --git a/test/src/unit-assert_macro.cpp b/test/src/unit-assert_macro.cpp index 826638fe6..2db78e8d9 100644 --- a/test/src/unit-assert_macro.cpp +++ b/test/src/unit-assert_macro.cpp @@ -27,13 +27,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -// avoid warning when assert does not abort -#if defined(__GNUC__) - #pragma GCC diagnostic ignored "-Wstrict-overflow" -#endif - #include "doctest_compatibility.h" +// avoid warning when assert does not abort +DOCTEST_GCC_SUPPRESS_WARNING_PUSH +DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow") +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wstrict-overflow") + /// global variable to record side effect of assert calls static int assert_counter; @@ -63,3 +64,6 @@ TEST_CASE("JSON_ASSERT(x)") } } #endif + +DOCTEST_GCC_SUPPRESS_WARNING_POP +DOCTEST_CLANG_SUPPRESS_WARNING_POP diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 4a544ea3f..fa2d8bbe7 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -48,6 +48,10 @@ using nlohmann::json; #define JSON_HAS_CPP_14 #endif +// NLOHMANN_JSON_SERIALIZE_ENUM uses a static std::pair +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors") + TEST_CASE("value conversion") { SECTION("get an object (explicit)") @@ -1712,3 +1716,5 @@ TEST_CASE("JSON to enum mapping") #ifdef JSON_HAS_CPP_14 #undef JSON_HAS_CPP_14 #endif + +DOCTEST_CLANG_SUPPRESS_WARNING_POP diff --git a/test/src/unit-disabled_exceptions.cpp b/test/src/unit-disabled_exceptions.cpp index 6da9dcf1d..7ab312556 100644 --- a/test/src/unit-disabled_exceptions.cpp +++ b/test/src/unit-disabled_exceptions.cpp @@ -29,6 +29,10 @@ SOFTWARE. #include "doctest_compatibility.h" +// disable -Wnoexcept as exceptions are switched off for this test suite +DOCTEST_GCC_SUPPRESS_WARNING_PUSH +DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") + #include using json = nlohmann::json; @@ -64,3 +68,5 @@ TEST_CASE("Tests with disabled exceptions") delete sax_no_exception::error_string; // NOLINT(cppcoreguidelines-owning-memory) } } + +DOCTEST_GCC_SUPPRESS_WARNING_POP diff --git a/test/src/unit-items.cpp b/test/src/unit-items.cpp index 6ecd90d7b..f86e64cb9 100644 --- a/test/src/unit-items.cpp +++ b/test/src/unit-items.cpp @@ -39,6 +39,12 @@ using nlohmann::json; #define JSON_HAS_CPP_14 #endif +// This test suite uses range for loops where values are copied. This is inefficient in usual code, but required to achieve 100% coverage. +DOCTEST_GCC_SUPPRESS_WARNING_PUSH +DOCTEST_GCC_SUPPRESS_WARNING("-Wrange-loop-construct") +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wrange-loop-construct") + TEST_CASE("iterator_wrapper") { SECTION("object") @@ -1456,3 +1462,6 @@ TEST_CASE("items()") #ifdef JSON_HAS_CPP_14 #undef JSON_HAS_CPP_14 #endif + +DOCTEST_GCC_SUPPRESS_WARNING_POP +DOCTEST_CLANG_SUPPRESS_WARNING_POP diff --git a/test/src/unit-json_pointer.cpp b/test/src/unit-json_pointer.cpp index 1e86c0a41..f6489907c 100644 --- a/test/src/unit-json_pointer.cpp +++ b/test/src/unit-json_pointer.cpp @@ -358,10 +358,10 @@ TEST_CASE("JSON pointers") CHECK_THROWS_WITH(j_const[jp] == 1, throw_msg.c_str()); } -#if defined(_MSC_VER) -#pragma warning (push) -#pragma warning (disable : 4127) // on some machines, the check below is not constant -#endif + // on some machines, the check below is not constant + DOCTEST_MSVC_SUPPRESS_WARNING_PUSH + DOCTEST_MSVC_SUPPRESS_WARNING(4127) + if (sizeof(typename json::size_type) < sizeof(unsigned long long)) { auto size_type_max_uul = static_cast((std::numeric_limits::max)()); @@ -375,9 +375,7 @@ TEST_CASE("JSON pointers") CHECK_THROWS_WITH(j_const[jp] == 1, throw_msg.c_str()); } -#if defined(_MSC_VER) -#pragma warning (pop) -#endif + DOCTEST_MSVC_SUPPRESS_WARNING_POP CHECK_THROWS_AS(j.at("/one"_json_pointer) = 1, json::parse_error&); CHECK_THROWS_WITH(j.at("/one"_json_pointer) = 1, diff --git a/test/src/unit-noexcept.cpp b/test/src/unit-noexcept.cpp index 25de3410f..d8f044e27 100644 --- a/test/src/unit-noexcept.cpp +++ b/test/src/unit-noexcept.cpp @@ -29,6 +29,10 @@ SOFTWARE. #include "doctest_compatibility.h" +// disable -Wnoexcept due to struct pod_bis +DOCTEST_GCC_SUPPRESS_WARNING_PUSH +DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") + #include using nlohmann::json; @@ -95,3 +99,5 @@ TEST_CASE("runtime checks") from_json(j2, pod_bis()); } } + +DOCTEST_GCC_SUPPRESS_WARNING_POP diff --git a/test/src/unit-readme.cpp b/test/src/unit-readme.cpp index 7da9c3bf5..df06dca8a 100644 --- a/test/src/unit-readme.cpp +++ b/test/src/unit-readme.cpp @@ -42,10 +42,9 @@ using nlohmann::json; #include #include -#if defined(_MSC_VER) - #pragma warning (push) - #pragma warning (disable : 4189) // local variable is initialized but not referenced -#endif +// local variable is initialized but not referenced +DOCTEST_MSVC_SUPPRESS_WARNING_PUSH +DOCTEST_MSVC_SUPPRESS_WARNING(4189) TEST_CASE("README" * doctest::skip()) { @@ -321,6 +320,4 @@ TEST_CASE("README" * doctest::skip()) } } -#if defined(_MSC_VER) - #pragma warning (pop) -#endif +DOCTEST_MSVC_SUPPRESS_WARNING_POP diff --git a/test/src/unit-regression2.cpp b/test/src/unit-regression2.cpp index c13513764..ed97d8e70 100644 --- a/test/src/unit-regression2.cpp +++ b/test/src/unit-regression2.cpp @@ -53,6 +53,10 @@ using nlohmann::json; #include #endif +// NLOHMANN_JSON_SERIALIZE_ENUM uses a static std::pair +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors") + ///////////////////////////////////////////////////////////////////// // for #1021 ///////////////////////////////////////////////////////////////////// @@ -656,3 +660,5 @@ TEST_CASE("regression tests 2") static_assert(std::is_copy_assignable::value, ""); } } + +DOCTEST_CLANG_SUPPRESS_WARNING_POP diff --git a/test/src/unit-udt.cpp b/test/src/unit-udt.cpp index 12770ce64..939a72bc3 100644 --- a/test/src/unit-udt.cpp +++ b/test/src/unit-udt.cpp @@ -29,6 +29,10 @@ SOFTWARE. #include "doctest_compatibility.h" +// disable -Wnoexcept due to class Evil +DOCTEST_GCC_SUPPRESS_WARNING_PUSH +DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") + #include using nlohmann::json; @@ -845,3 +849,5 @@ TEST_CASE("Issue #1237") struct non_convertible_type {}; static_assert(!std::is_convertible::value, ""); } + +DOCTEST_GCC_SUPPRESS_WARNING_POP diff --git a/test/src/unit-unicode2.cpp b/test/src/unit-unicode2.cpp index 074704bba..d2effdcfe 100644 --- a/test/src/unit-unicode2.cpp +++ b/test/src/unit-unicode2.cpp @@ -41,6 +41,10 @@ using nlohmann::json; #include #include +// this test suite uses static variables with non-trivial destructors +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors") + namespace { extern size_t calls; @@ -623,3 +627,5 @@ TEST_CASE("Unicode (2/5)" * doctest::skip()) } } } + +DOCTEST_CLANG_SUPPRESS_WARNING_POP diff --git a/test/src/unit-unicode3.cpp b/test/src/unit-unicode3.cpp index 81bf89ba0..1cda08f6f 100644 --- a/test/src/unit-unicode3.cpp +++ b/test/src/unit-unicode3.cpp @@ -41,6 +41,10 @@ using nlohmann::json; #include #include +// this test suite uses static variables with non-trivial destructors +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors") + namespace { extern size_t calls; @@ -337,3 +341,5 @@ TEST_CASE("Unicode (3/5)" * doctest::skip()) } } } + +DOCTEST_CLANG_SUPPRESS_WARNING_POP diff --git a/test/src/unit-unicode4.cpp b/test/src/unit-unicode4.cpp index 2a268c1fb..63990d45c 100644 --- a/test/src/unit-unicode4.cpp +++ b/test/src/unit-unicode4.cpp @@ -41,6 +41,10 @@ using nlohmann::json; #include #include +// this test suite uses static variables with non-trivial destructors +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors") + namespace { extern size_t calls; @@ -337,3 +341,5 @@ TEST_CASE("Unicode (4/5)" * doctest::skip()) } } } + +DOCTEST_CLANG_SUPPRESS_WARNING_POP diff --git a/test/src/unit-unicode5.cpp b/test/src/unit-unicode5.cpp index abe851469..405227ad3 100644 --- a/test/src/unit-unicode5.cpp +++ b/test/src/unit-unicode5.cpp @@ -41,6 +41,10 @@ using nlohmann::json; #include #include +// this test suite uses static variables with non-trivial destructors +DOCTEST_CLANG_SUPPRESS_WARNING_PUSH +DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors") + namespace { extern size_t calls; @@ -337,3 +341,5 @@ TEST_CASE("Unicode (5/5)" * doctest::skip()) } } } + +DOCTEST_CLANG_SUPPRESS_WARNING_POP