Fix the false -Warray-bounds error by setting the type after the value

The pragma around set_parents() is no longer needed: the base branch
(#5585) creates a value before setting its type. Before, the type of a new
string was stored first, so GCC had to assume that operator new could
change it again, kept the object branch of the inlined set_parents() alive,
and checked it against the string's allocation. Rewriting set_parents()
itself (if/else instead of switch) does not help.

Verified with Docker GCC 12.5, 13, 14, 15.3 and 16.2: the regression test
builds and passes without the pragma, and fails to build on develop.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann committed 2026-10-02 08:27:31 +02:00
1 parent 45c4331dd8
commit 4d5bd3cc82
3 files changed
+8 -28

No files matched your search

-12
View File
@@ -763,15 +763,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
static_cast<void>(check_parents);
}
// GCC 13 to at least 15 report a false -Warray-bounds error when set_parents()
// is inlined at -O3 right after a non-container value was created: the analysis
// does not use m_type to rule out the object/array branches and checks
// the std::map access against the allocation of, e.g., a string.
// See https://github.com/nlohmann/json/issues/5742 and #4819.
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Warray-bounds"
#endif
void set_parents()
{
#if JSON_DIAGNOSTICS
@@ -808,9 +799,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
}
#endif
}
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif
iterator set_parents(iterator it, std::ptrdiff_t count_set_parents)
{