From f8df3df0213fce4ba8a40389b7dad3f8f4c5d0a1 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 23 Oct 2026 22:16:26 +0200 Subject: [PATCH] Fix CI failures: constexpr, NRVO, cppcheck, IWYU (#5891) - json_sax_dom_error_state::is_errored() cannot be constexpr: the class is not a literal type (GCC 4.8, GCC -Wpedantic, Clang 3.5). - to_binary_vector: destroy the vector writer before returning, as the output_vector_sink sets the size of the vector in its destructor. Without NRVO (MSVC Debug in C++14 mode), the vector was moved out before it was resized. - parser::sax_parse: return false instead of result after the early exit (cppcheck identicalConditionAfterEarlyExit). - json.hpp: export detail/exceptions.hpp for IWYU, so json_view.hpp can name exception_id without including a detail header. Signed-off-by: Niels Lohmann --- include/nlohmann/detail/input/json_sax.hpp | 2 +- include/nlohmann/detail/input/parser.hpp | 2 +- include/nlohmann/json.hpp | 10 +++++++--- single_include/nlohmann/json.hpp | 14 +++++++++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 6a56b3453..b3dc8787c 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -349,7 +349,7 @@ class json_sax_dom_error_state return false; } - constexpr bool is_errored() const + bool is_errored() const { return errored; } diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index f06488c99..50132bdde 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -168,7 +168,7 @@ class parser return finish_input(*sax, strict); } - return result; + return false; } private: diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 228084a5a..c0111a6dd 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -55,7 +55,7 @@ #include // IWYU pragma: export #include // IWYU pragma: keep #include // IWYU pragma: keep -#include +#include // IWYU pragma: export #include #include #include @@ -3144,8 +3144,12 @@ public: { std::vector result; result.reserve(detail::binary_initial_capacity(j)); - auto writer = vector_writer(result, error_handler); - write(writer); + { + // the sink sets the size of result when it is destroyed, which + // must happen before result is returned (without NRVO, it is moved) + auto writer = vector_writer(result, error_handler); + write(writer); + } return result; } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 92468f89e..219901b85 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -8255,7 +8255,7 @@ NLOHMANN_JSON_NAMESPACE_END // #include // IWYU pragma: keep // #include - +// IWYU pragma: export // #include // __ _____ _____ _____ // __| | __| | | | JSON for Modern C++ @@ -15390,7 +15390,7 @@ class json_sax_dom_error_state return false; } - constexpr bool is_errored() const + bool is_errored() const { return errored; } @@ -21024,7 +21024,7 @@ class parser return finish_input(*sax, strict); } - return result; + return false; } private: @@ -37855,8 +37855,12 @@ public: { std::vector result; result.reserve(detail::binary_initial_capacity(j)); - auto writer = vector_writer(result, error_handler); - write(writer); + { + // the sink sets the size of result when it is destroyed, which + // must happen before result is returned (without NRVO, it is moved) + auto writer = vector_writer(result, error_handler); + write(writer); + } return result; }