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:
3 files changed
+8
-28
No files matched your search
@@ -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)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user