mirror of
https://github.com/nlohmann/json.git
synced 2026-10-03 05:00:30 +00:00
* Fix CI configuration broken by recent merges and tool updates - gcc_flags.cmake: drop -Wexperimental-fmv-target, which GCC 16 accepts only on aarch64; amd64 rejects it, so every GCC job failed while checking the compiler. - ci_get_cmake: add VERBATIM so the checksum pipeline is passed to the shell intact (the unescaped `$'` broke the generated Makefile and build.ninja, failing ci_cmake_flags and ci_module_cpp20); match the SHA-256 entry case-insensitively, as CMake 3.5.0 lists the archive as "Linux-x86_64"; and unpack with --strip-components, as that archive's top-level directory is spelled "Linux" too. - ci_single_binaries: compile json.hpp's TU without IWYU's --error, as the comment above the gate already intends. - tests: restore -Wno-deprecated-declarations for all non-MSVC compilers (#5737 kept it for GCC only), as several tests call deprecated functions on purpose; include thirdparty/fifo_map as SYSTEM. - .clang-tidy: set misc-use-internal-linkage.AnalyzeTypes to false; clang-tidy 22.1 extended the check to classes and enums and flagged 100 test helper types. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Fix library warnings and a JSON_DIAGNOSTICS parent bug - binary_reader: pass integers to sax->number_integer() through conditional_static_cast<number_integer_t>, making the existing narrowing for a narrow number_integer_t explicit (MSVC C4244 and GCC -Wconversion/-Warith-conversion with the int16_t test from #5694); mark two Infer DEAD_STORE false positives with @infer-ignore. - to_json: set the parents of an array built from a C++20 range view after all elements are in place; a reallocating push_back moved the earlier elements and left their parent pointers stale, failing the JSON_DIAGNOSTICS invariant assertion. - json.hpp: suppress MSVC C4127 for the new is_ordered_map check in diff(), like the three existing ones; spell out std::formatter::parse's return and iterator types for clang-tidy 22.1. - number_parse: make the Eisel-Lemire digit counter unsigned (GCC -Wstrict-overflow). - string_utils: take encode_utf8's callable by const reference (cppcoreguidelines-missing-std-forward) and drop a \u from its doc comment (-Wdocumentation-unknown-command). - ordered_map: include <memory> for std::allocator (cpplint). Ran make amalgamate. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Fix tests failing in CI on develop - unit-allocator: skip the #5640 test under MSVC STL iterator debugging, where containers allocate a debug proxy in noexcept move constructors and a failing allocation terminates; move a decrement out of an if condition (bugprone-inc-dec-in-conditions). - unit-conversions: expect the "(/0)" path with JSON_DIAGNOSTICS; compare strict enums via get<>() rather than through the noexcept operator==(ScalarType, json), which bugprone-exception-escape flags. - unit-alt-string: suppress -Wexit-time-destructors for the strict enum macro and misc-use-internal-linkage for its enum. - unit-bjdata: call the static lookup functions through the type and pass unsigned char (-Wsign-conversion on amd64). - Mark Infer false positives with @infer-ignore in unit-diagnostics, unit-pointer_access, unit-udt, and unit-conversions. - Smaller clang-tidy 22.1 findings in unit-class_parser, unit-constructor2, unit-custom-base-class, unit-locale-cpp, and unit-noexcept. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
84 lines
3.9 KiB
C++
84 lines
3.9 KiB
C++
// __ _____ _____ _____
|
|
// __| | __| | | | JSON for Modern C++ (supporting code)
|
|
// | | |__ | | | | | | version 3.12.0
|
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
//
|
|
// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#include "doctest_compatibility.h"
|
|
|
|
// disable -Wnoexcept due to struct pod_bis
|
|
DOCTEST_GCC_SUPPRESS_WARNING_PUSH
|
|
DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept")
|
|
|
|
// skip tests if JSON_DisableEnumSerialization=ON (#4384)
|
|
#if defined(JSON_DISABLE_ENUM_SERIALIZATION) && (JSON_DISABLE_ENUM_SERIALIZATION == 1)
|
|
#define SKIP_TESTS_FOR_ENUM_SERIALIZATION
|
|
#endif
|
|
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using nlohmann::json;
|
|
|
|
namespace
|
|
{
|
|
enum test {}; // NOLINT(cppcoreguidelines-use-enum-class)
|
|
|
|
struct pod {};
|
|
struct pod_bis {};
|
|
|
|
void to_json(json& /*unused*/, pod /*unused*/) noexcept;
|
|
void to_json(json& /*unused*/, pod_bis /*unused*/);
|
|
void from_json(const json& /*unused*/, pod /*unused*/) noexcept;
|
|
void from_json(const json& /*unused*/, pod_bis /*unused*/);
|
|
void to_json(json& /*unused*/, pod /*unused*/) noexcept {}
|
|
void to_json(json& /*unused*/, pod_bis /*unused*/) {}
|
|
void from_json(const json& /*unused*/, pod /*unused*/) noexcept {}
|
|
void from_json(const json& /*unused*/, pod_bis /*unused*/) {}
|
|
|
|
static_assert(noexcept(json{}), "");
|
|
static_assert(noexcept(nlohmann::to_json(std::declval<json&>(), 2)), "");
|
|
static_assert(noexcept(nlohmann::to_json(std::declval<json&>(), 2.5)), "");
|
|
static_assert(noexcept(nlohmann::to_json(std::declval<json&>(), true)), "");
|
|
#ifndef SKIP_TESTS_FOR_ENUM_SERIALIZATION
|
|
static_assert(noexcept(nlohmann::to_json(std::declval<json&>(), test {})), "");
|
|
#endif
|
|
static_assert(noexcept(nlohmann::to_json(std::declval<json&>(), pod {})), "");
|
|
static_assert(!noexcept(nlohmann::to_json(std::declval<json&>(), pod_bis{})), "");
|
|
static_assert(noexcept(json(2)), "");
|
|
#ifndef SKIP_TESTS_FOR_ENUM_SERIALIZATION
|
|
static_assert(noexcept(json(test {})), "");
|
|
#endif
|
|
static_assert(noexcept(json(pod {})), "");
|
|
static_assert(noexcept(std::declval<json>().get<pod>()), "");
|
|
static_assert(!noexcept(std::declval<json>().get<pod_bis>()), "");
|
|
static_assert(noexcept(json(pod{})), "");
|
|
} // namespace
|
|
|
|
TEST_CASE("noexcept")
|
|
{
|
|
// silence -Wunneeded-internal-declaration errors
|
|
static_cast<void>(static_cast<void(*)(json&, pod)>(&to_json));
|
|
static_cast<void>(static_cast<void(*)(json&, pod_bis)>(&to_json)); // NOLINT(readability-redundant-casting): selects the overload
|
|
static_cast<void>(static_cast<void(*)(const json&, pod)>(&from_json));
|
|
static_cast<void>(static_cast<void(*)(const json&, pod_bis)>(&from_json)); // NOLINT(readability-redundant-casting): selects the overload
|
|
|
|
SECTION("nothrow-copy-constructible exceptions")
|
|
{
|
|
// for ERR60-CPP (https://github.com/nlohmann/json/issues/531):
|
|
// Exceptions should be nothrow-copy-constructible. However, compilers
|
|
// treat std::runtime_exception differently in this regard. Therefore,
|
|
// we can only demand nothrow-copy-constructibility for our exceptions
|
|
// if std::runtime_exception is.
|
|
CHECK(std::is_nothrow_copy_constructible<json::exception>::value == std::is_nothrow_copy_constructible<std::runtime_error>::value);
|
|
CHECK(std::is_nothrow_copy_constructible<json::parse_error>::value == std::is_nothrow_copy_constructible<std::runtime_error>::value);
|
|
CHECK(std::is_nothrow_copy_constructible<json::invalid_iterator>::value == std::is_nothrow_copy_constructible<std::runtime_error>::value);
|
|
CHECK(std::is_nothrow_copy_constructible<json::type_error>::value == std::is_nothrow_copy_constructible<std::runtime_error>::value);
|
|
CHECK(std::is_nothrow_copy_constructible<json::out_of_range>::value == std::is_nothrow_copy_constructible<std::runtime_error>::value);
|
|
CHECK(std::is_nothrow_copy_constructible<json::other_error>::value == std::is_nothrow_copy_constructible<std::runtime_error>::value);
|
|
}
|
|
}
|
|
|
|
DOCTEST_GCC_SUPPRESS_WARNING_POP
|