diff --git a/include/nlohmann/detail/diagnostics_t.hpp b/include/nlohmann/detail/diagnostics_t.hpp index 4e943cad5..f89b0e3d1 100644 --- a/include/nlohmann/detail/diagnostics_t.hpp +++ b/include/nlohmann/detail/diagnostics_t.hpp @@ -36,7 +36,7 @@ class diagnostics_t { for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i) { - if (current->m_parent->m_value.array->operator[](i) == *current) + if (¤t->m_parent->m_value.array->operator[](i) == current) { tokens.emplace_back(std::to_string(i)); break; @@ -49,7 +49,7 @@ class diagnostics_t { for (const auto& element : *current->m_parent->m_value.object) { - if (element.second == *current) + if (&element.second == current) { tokens.emplace_back(element.first.c_str()); break; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 6cb7dc1b9..fc9f6d630 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -2534,7 +2534,7 @@ class diagnostics_t { for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i) { - if (current->m_parent->m_value.array->operator[](i) == *current) + if (¤t->m_parent->m_value.array->operator[](i) == current) { tokens.emplace_back(std::to_string(i)); break; @@ -2547,7 +2547,7 @@ class diagnostics_t { for (const auto& element : *current->m_parent->m_value.object) { - if (element.second == *current) + if (&element.second == current) { tokens.emplace_back(element.first.c_str()); break; diff --git a/test/src/unit-diagnostics.cpp b/test/src/unit-diagnostics.cpp index 8bd5c41fa..5885f6ecb 100644 --- a/test/src/unit-diagnostics.cpp +++ b/test/src/unit-diagnostics.cpp @@ -95,4 +95,10 @@ TEST_CASE("Better diagnostics") { CHECK_THROWS_WITH_AS(json::parse(""), "[json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - unexpected end of input; expected '[', '{', or a literal", json::parse_error); } + + SECTION("Regression test for https://github.com/nlohmann/json/pull/2562#pullrequestreview-574858448") + { + CHECK_THROWS_WITH_AS(json({"0", "0"})[1].get(), "[json.exception.type_error.302] (/1) type must be number, but is string", json::type_error); + CHECK_THROWS_WITH_AS(json({"0", "1"})[1].get(), "[json.exception.type_error.302] (/1) type must be number, but is string", json::type_error); + } }