Unverified Commit 62f2997b authored by Carl Smedstad's avatar Carl Smedstad Committed by GitHub

Fix assertion failure for JSON_DIAGNOSTICS (#3037)

* Fix assertion failure #3032
parent ea528bbf
...@@ -3695,15 +3695,25 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec ...@@ -3695,15 +3695,25 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
if (idx >= m_value.array->size()) if (idx >= m_value.array->size())
{ {
#if JSON_DIAGNOSTICS #if JSON_DIAGNOSTICS
// remember array size before resizing // remember array size & capacity before resizing
const auto previous_size = m_value.array->size(); const auto old_size = m_value.array->size();
const auto old_capacity = m_value.array->capacity();
#endif #endif
m_value.array->resize(idx + 1); m_value.array->resize(idx + 1);
#if JSON_DIAGNOSTICS #if JSON_DIAGNOSTICS
// set parent for values added above if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity))
set_parents(begin() + static_cast<typename iterator::difference_type>(previous_size), static_cast<typename iterator::difference_type>(idx + 1 - previous_size)); {
// capacity has changed: update all parents
set_parents();
}
else
{
// set parent for values added above
set_parents(begin() + static_cast<typename iterator::difference_type>(old_size), static_cast<typename iterator::difference_type>(idx + 1 - old_size));
}
#endif #endif
assert_invariant();
} }
return m_value.array->operator[](idx); return m_value.array->operator[](idx);
......
...@@ -21101,15 +21101,25 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec ...@@ -21101,15 +21101,25 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
if (idx >= m_value.array->size()) if (idx >= m_value.array->size())
{ {
#if JSON_DIAGNOSTICS #if JSON_DIAGNOSTICS
// remember array size before resizing // remember array size & capacity before resizing
const auto previous_size = m_value.array->size(); const auto old_size = m_value.array->size();
const auto old_capacity = m_value.array->capacity();
#endif #endif
m_value.array->resize(idx + 1); m_value.array->resize(idx + 1);
#if JSON_DIAGNOSTICS #if JSON_DIAGNOSTICS
// set parent for values added above if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity))
set_parents(begin() + static_cast<typename iterator::difference_type>(previous_size), static_cast<typename iterator::difference_type>(idx + 1 - previous_size)); {
// capacity has changed: update all parents
set_parents();
}
else
{
// set parent for values added above
set_parents(begin() + static_cast<typename iterator::difference_type>(old_size), static_cast<typename iterator::difference_type>(idx + 1 - old_size));
}
#endif #endif
assert_invariant();
} }
return m_value.array->operator[](idx); return m_value.array->operator[](idx);
......
...@@ -234,4 +234,21 @@ TEST_CASE("Better diagnostics") ...@@ -234,4 +234,21 @@ TEST_CASE("Better diagnostics")
root.push_back(lower); root.push_back(lower);
} }
} }
SECTION("Regression test for https://github.com/nlohmann/json/issues/3032")
{
// reference operator[](size_type idx)
{
json j_arr = json::array();
j_arr[0] = 0;
j_arr[1] = 1;
j_arr[2] = 2;
j_arr[3] = 3;
j_arr[4] = 4;
j_arr[5] = 5;
j_arr[6] = 6;
j_arr[7] = 7;
json j_arr_copy = j_arr;
}
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment