Fix compiler warnings on develop from the API performance stack (#5858)

These PRs were merged while their CI runs were cancelled, so the warnings
went unnoticed. All of them fail the -Werror builds:

- json_pointer.hpp (#5836): size_t += int under GCC -Wsign-conversion
- binary_reader.hpp (#5839): char_int_type passed as char under GCC
  -Wconversion
- json.hpp (#5838): @throw without a description under clang
  -Wdocumentation
- string_escape.hpp (#5836): escape_into() was inserted between escape()
  and its documentation, so the @return was attached to a void function
- unit-diagnostics.cpp (#5832): clang -Wnrvo in a lambda without an
  explicit return type
- unit-to_json-rvalue.cpp (#5837): GCC -Wnoexcept (C++20) and clang
  -Wunneeded-member-function on the test type

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann authored and GitHub committed 2026-10-15 22:42:46 +02:00
1 parent c314cf8bd4
commit 4da73dc5ff
7 files changed
+38 -41

No files matched your search

@@ -4272,7 +4272,7 @@ class binary_reader
} }
JSON_HEDLEY_NEVER_INLINE JSON_HEDLEY_NEVER_INLINE
bool bson_unsupported_type_error(const std::size_t position, const char element_type) const bool bson_unsupported_type_error(const std::size_t position, const char_int_type element_type) const
{ {
const std::string cr_str = hex_byte(static_cast<std::uint8_t>(element_type)); const std::string cr_str = hex_byte(static_cast<std::uint8_t>(element_type));
return sax->parse_error(position, cr_str, return sax->parse_error(position, cr_str,
+1 -1
View File
@@ -1077,7 +1077,7 @@ class json_pointer
std::size_t token_count = 0; std::size_t token_count = 0;
for (std::size_t i = 0; i < size; ++i) for (std::size_t i = 0; i < size; ++i)
{ {
token_count += (reference_string[i] == '/') ? 1 : 0; token_count += static_cast<std::size_t>(reference_string[i] == '/');
} }
result.reserve(token_count); result.reserve(token_count);
+13 -12
View File
@@ -17,18 +17,7 @@ NLOHMANN_JSON_NAMESPACE_BEGIN
namespace detail namespace detail
{ {
/*! /// append @a s to @a out, escaped like @ref escape does
* @brief string escaping as described in RFC 6901 (Sect. 4)
* @param[in] s string to escape
* @return escaped string
*
* Note the order of escaping "~" to "~0" and "/" to "~1" is important.
*
* The string is rebuilt in a single pass, appending whole runs between the
* characters that need escaping, while repeated replace() calls would move
* the tail of the string once per escaped character. @ref escape_into appends
* the escaped string to an existing one.
*/
template<typename StringType> template<typename StringType>
inline void escape_into(StringType& out, const StringType& s) inline void escape_into(StringType& out, const StringType& s)
{ {
@@ -47,6 +36,18 @@ inline void escape_into(StringType& out, const StringType& s)
out.append(s.data() + run, size - run); out.append(s.data() + run, size - run);
} }
/*!
* @brief string escaping as described in RFC 6901 (Sect. 4)
* @param[in] s string to escape
* @return escaped string
*
* Note the order of escaping "~" to "~0" and "/" to "~1" is important.
*
* The string is rebuilt in a single pass, appending whole runs between the
* characters that need escaping, while repeated replace() calls would move
* the tail of the string once per escaped character. @ref escape_into appends
* the escaped string to an existing one.
*/
template<typename StringType> template<typename StringType>
inline StringType escape(const StringType& s) inline StringType escape(const StringType& s)
{ {
+2 -2
View File
@@ -3058,14 +3058,14 @@ public:
JSON_THROW(std::length_error(detail::concat("array index ", std::to_string(idx), " exceeds size_type"))); JSON_THROW(std::length_error(detail::concat("array index ", std::to_string(idx), " exceeds size_type")));
} }
/// @throw out_of_range.401 /// @throw out_of_range.401 always, as @a idx is out of range of @a j
JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE
static void throw_array_index_out_of_range(size_type idx, const basic_json& j) static void throw_array_index_out_of_range(size_type idx, const basic_json& j)
{ {
JSON_THROW(out_of_range::create(detail::exception_id::array_index_out_of_range, detail::concat("array index ", std::to_string(idx), " is out of range"), &j)); JSON_THROW(out_of_range::create(detail::exception_id::array_index_out_of_range, detail::concat("array index ", std::to_string(idx), " is out of range"), &j));
} }
/// @throw out_of_range.403 /// @throw out_of_range.403 always, as @a key is not found in @a j
template<typename KeyType> template<typename KeyType>
JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE
static void throw_key_not_found(const KeyType& key, const basic_json& j) static void throw_key_not_found(const KeyType& key, const basic_json& j)
+17 -16
View File
@@ -3452,18 +3452,7 @@ NLOHMANN_JSON_NAMESPACE_BEGIN
namespace detail namespace detail
{ {
/*! /// append @a s to @a out, escaped like @ref escape does
* @brief string escaping as described in RFC 6901 (Sect. 4)
* @param[in] s string to escape
* @return escaped string
*
* Note the order of escaping "~" to "~0" and "/" to "~1" is important.
*
* The string is rebuilt in a single pass, appending whole runs between the
* characters that need escaping, while repeated replace() calls would move
* the tail of the string once per escaped character. @ref escape_into appends
* the escaped string to an existing one.
*/
template<typename StringType> template<typename StringType>
inline void escape_into(StringType& out, const StringType& s) inline void escape_into(StringType& out, const StringType& s)
{ {
@@ -3482,6 +3471,18 @@ inline void escape_into(StringType& out, const StringType& s)
out.append(s.data() + run, size - run); out.append(s.data() + run, size - run);
} }
/*!
* @brief string escaping as described in RFC 6901 (Sect. 4)
* @param[in] s string to escape
* @return escaped string
*
* Note the order of escaping "~" to "~0" and "/" to "~1" is important.
*
* The string is rebuilt in a single pass, appending whole runs between the
* characters that need escaping, while repeated replace() calls would move
* the tail of the string once per escaped character. @ref escape_into appends
* the escaped string to an existing one.
*/
template<typename StringType> template<typename StringType>
inline StringType escape(const StringType& s) inline StringType escape(const StringType& s)
{ {
@@ -19066,7 +19067,7 @@ class binary_reader
} }
JSON_HEDLEY_NEVER_INLINE JSON_HEDLEY_NEVER_INLINE
bool bson_unsupported_type_error(const std::size_t position, const char element_type) const bool bson_unsupported_type_error(const std::size_t position, const char_int_type element_type) const
{ {
const std::string cr_str = hex_byte(static_cast<std::uint8_t>(element_type)); const std::string cr_str = hex_byte(static_cast<std::uint8_t>(element_type));
return sax->parse_error(position, cr_str, return sax->parse_error(position, cr_str,
@@ -22019,7 +22020,7 @@ class json_pointer
std::size_t token_count = 0; std::size_t token_count = 0;
for (std::size_t i = 0; i < size; ++i) for (std::size_t i = 0; i < size; ++i)
{ {
token_count += (reference_string[i] == '/') ? 1 : 0; token_count += static_cast<std::size_t>(reference_string[i] == '/');
} }
result.reserve(token_count); result.reserve(token_count);
@@ -33091,14 +33092,14 @@ public:
JSON_THROW(std::length_error(detail::concat("array index ", std::to_string(idx), " exceeds size_type"))); JSON_THROW(std::length_error(detail::concat("array index ", std::to_string(idx), " exceeds size_type")));
} }
/// @throw out_of_range.401 /// @throw out_of_range.401 always, as @a idx is out of range of @a j
JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE
static void throw_array_index_out_of_range(size_type idx, const basic_json& j) static void throw_array_index_out_of_range(size_type idx, const basic_json& j)
{ {
JSON_THROW(out_of_range::create(detail::exception_id::array_index_out_of_range, detail::concat("array index ", std::to_string(idx), " is out of range"), &j)); JSON_THROW(out_of_range::create(detail::exception_id::array_index_out_of_range, detail::concat("array index ", std::to_string(idx), " is out of range"), &j));
} }
/// @throw out_of_range.403 /// @throw out_of_range.403 always, as @a key is not found in @a j
template<typename KeyType> template<typename KeyType>
JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE JSON_HEDLEY_NO_RETURN JSON_HEDLEY_NEVER_INLINE
static void throw_key_not_found(const KeyType& key, const basic_json& j) static void throw_key_not_found(const KeyType& key, const basic_json& j)
+1 -1
View File
@@ -733,7 +733,7 @@ TEST_CASE_TEMPLATE("Parent pointers stay consistent", J, json, ordered_json)
TEST_CASE_TEMPLATE("update() and merge_patch() keep parent pointers and diagnostic paths", J, json, ordered_json) TEST_CASE_TEMPLATE("update() and merge_patch() keep parent pointers and diagnostic paths", J, json, ordered_json)
{ {
// enough keys to make the vector behind ordered_json reallocate several times // enough keys to make the vector behind ordered_json reallocate several times
const auto make_object = [](int first, int last) const auto make_object = [](int first, int last) -> J
{ {
J o = J::object(); J o = J::object();
for (int i = first; i < last; ++i) for (int i = first; i < last; ++i)
+3 -8
View File
@@ -39,20 +39,15 @@ struct tracked
std::string payload; std::string payload;
bool moved_from = false; bool moved_from = false;
explicit tracked(std::string p) : payload(std::move(p)) {} explicit tracked(std::string p) noexcept : payload(std::move(p)) {}
tracked(const tracked&) = default; tracked(const tracked&) = default;
tracked& operator=(const tracked&) = default; tracked& operator=(const tracked&) = default;
tracked(tracked&& other) noexcept : payload(std::move(other.payload)), moved_from(other.moved_from) tracked(tracked&& other) noexcept : payload(std::move(other.payload)), moved_from(other.moved_from)
{ {
other.moved_from = true; other.moved_from = true;
} }
tracked& operator=(tracked&& other) noexcept // not needed by the tests (and an unused definition fails -Wunneeded-member-function)
{ tracked& operator=(tracked&&) = delete;
payload = std::move(other.payload);
moved_from = other.moved_from;
other.moved_from = true;
return *this;
}
~tracked() = default; ~tracked() = default;
}; };