From 4adf70fe81428e46125934c11731e9ac30a152a5 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 26 Sep 2026 11:57:17 +0200 Subject: [PATCH] Move the explicit basic_json instantiation into its own test file Linking test-regression3_cpp20 with clang and MinGW failed with "relocation truncated to fit: IMAGE_REL_AMD64_REL32 against `.rdata'", as test-regression2 did before #5511. The explicit instantiation of basic_json<> for #4825 compiles every member function, including the BON8 reader and writer, into that object, and it was already close to the limit (2,226,104 bytes on develop, 2,234,960 with BON8; clang -O1, C++20). Give the instantiation a file of its own: unit-regression3 is now 1,594,736 bytes and unit-explicit_instantiation 1,095,064. The new file mentions JSON_HAS_CPP_17 and JSON_HAS_CPP_20 so it keeps being built for the C++17 standard the regression was about. Signed-off-by: Niels Lohmann --- tests/src/unit-explicit_instantiation.cpp | 37 +++++++++++++++++++++++ tests/src/unit-regression3.cpp | 8 +---- 2 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 tests/src/unit-explicit_instantiation.cpp diff --git a/tests/src/unit-explicit_instantiation.cpp b/tests/src/unit-explicit_instantiation.cpp new file mode 100644 index 000000000..71132a59f --- /dev/null +++ b/tests/src/unit-explicit_instantiation.cpp @@ -0,0 +1,37 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ (supporting code) +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann +// SPDX-License-Identifier: MIT + +// cmake/test.cmake selects the C++ standard versions with which to build a +// unit test based on the presence of JSON_HAS_CPP_ macros. +// The regression below only showed on C++17, so build this file for every +// standard like the other regression tests: +// JSON_HAS_CPP_17 JSON_HAS_CPP_20 (do not remove; see note at top of file) + +#include "doctest_compatibility.h" + +#include +using json = nlohmann::json; + +///////////////////////////////////////////////////////////////////// +// for #4825 - explicitly instantiating basic_json must compile; this +// forces instantiation of binary_writer::write_bjdata_ndarray, whose +// static_cast was ambiguous under explicit instantiation on +// C++17. Merely compiling this translation unit is the regression test. +// +// The instantiation compiles every member function, so it has a file of its +// own: in unit-regression3.cpp it made the object too large for the MinGW +// linker to relocate (see #5511). +///////////////////////////////////////////////////////////////////// +template class nlohmann::basic_json<>; + +TEST_CASE("explicit instantiation of basic_json (#4825)") +{ + const json j = {1, "two", 3.0}; + CHECK(j.size() == 3); + CHECK(json::from_bjdata(json::to_bjdata(j)) == j); +} diff --git a/tests/src/unit-regression3.cpp b/tests/src/unit-regression3.cpp index dc9843ccb..1c2ebd3f0 100644 --- a/tests/src/unit-regression3.cpp +++ b/tests/src/unit-regression3.cpp @@ -74,13 +74,7 @@ using ordered_json = nlohmann::ordered_json; #endif #endif -///////////////////////////////////////////////////////////////////// -// for #4825 - explicitly instantiating basic_json must compile; this -// forces instantiation of binary_writer::write_bjdata_ndarray, whose -// static_cast was ambiguous under explicit instantiation on -// C++17. Merely compiling this translation unit is the regression test. -///////////////////////////////////////////////////////////////////// -template class nlohmann::basic_json<>; +// the explicit instantiation for #4825 is in unit-explicit_instantiation.cpp ///////////////////////////////////////////////////////////////////// // for #4440