diff --git a/README.md b/README.md index 1ee358e5..6451e2c5 100644 --- a/README.md +++ b/README.md @@ -563,7 +563,9 @@ namespace nlohmann { } static void from_json(const json& j, boost::optional& opt) { - if (!j.is_null()) { + if (j.is_null()) { + opt = boost::none; + } else { opt = j.get(); // same as above, but with // adl_serializer::from_json } diff --git a/src/json.hpp b/src/json.hpp index 5fdd83d6..c77945a8 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3036,10 +3036,8 @@ class basic_json { return m_value.boolean; } - else - { - JSON_THROW(std::domain_error("type must be boolean, but is " + type_name())); - } + + JSON_THROW(std::domain_error("type must be boolean, but is " + type_name())); } /// get a pointer to the value (object) @@ -8534,10 +8532,11 @@ class basic_json return *this; } - primitive_iterator_t& operator++(int) + primitive_iterator_t operator++(int) { + auto result = *this; m_it++; - return *this; + return result; } primitive_iterator_t& operator--() @@ -8546,10 +8545,11 @@ class basic_json return *this; } - primitive_iterator_t& operator--(int) + primitive_iterator_t operator--(int) { + auto result = *this; m_it--; - return *this; + return result; } primitive_iterator_t& operator+=(difference_type n) diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 068b8763..109a4f26 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3036,10 +3036,8 @@ class basic_json { return m_value.boolean; } - else - { - JSON_THROW(std::domain_error("type must be boolean, but is " + type_name())); - } + + JSON_THROW(std::domain_error("type must be boolean, but is " + type_name())); } /// get a pointer to the value (object) @@ -8534,10 +8532,11 @@ class basic_json return *this; } - primitive_iterator_t& operator++(int) + primitive_iterator_t operator++(int) { + auto result = *this; m_it++; - return *this; + return result; } primitive_iterator_t& operator--() @@ -8546,10 +8545,11 @@ class basic_json return *this; } - primitive_iterator_t& operator--(int) + primitive_iterator_t operator--(int) { + auto result = *this; m_it--; - return *this; + return result; } primitive_iterator_t& operator+=(difference_type n) diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 3dfad5bd..59ea3cef 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -596,6 +596,32 @@ TEST_CASE("parser class") "missing or wrong low surrogate"); } + SECTION("tests found by mutate++") + { + // test case to make sure no comma preceeds the first key + CHECK_THROWS_AS(json::parser("{,\"key\": false}").parse(), std::invalid_argument); + // test case to make sure an object is properly closed + CHECK_THROWS_AS(json::parser("[{\"key\": false true]").parse(), std::invalid_argument); + + // test case to make sure the callback is properly evaluated after reading a key + { + json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed) + { + if (event == json::parse_event_t::key) + { + return false; + } + else + { + return true; + } + }; + + json x = json::parse("{\"key\": false}", cb); + CHECK(x == json::object()); + } + } + SECTION("callback function") { auto s_object = R"(