diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 1a5033df..9d48e29d 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -1537,31 +1537,6 @@ NLOHMANN_JSON_SERIALIZE_ENUM(TaskState, {TS_COMPLETED, "completed"}, }) -namespace -{ -// Helper struct to test whether compile error does not trigger upon -// conversion of an enum in the presence of non-member operator== for -// user-defined type with "non default" from_json function (#1647). -struct NonDefaultFromJsonStruct { }; - -inline bool operator== (NonDefaultFromJsonStruct const& lhs, NonDefaultFromJsonStruct const& rhs) -{ - return true; -} -} - -namespace nlohmann -{ -template <> -struct adl_serializer -{ - static NonDefaultFromJsonStruct from_json (json const& j) - { - return {}; - } -}; -} - TEST_CASE("JSON to enum mapping") { SECTION("enum class") diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 0c75dcbc..869d6cc8 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -159,6 +159,38 @@ bool operator==(Data const& lhs, Data const& rhs) using float_json = nlohmann::basic_json; +///////////////////////////////////////////////////////////////////// +// for #1647 +///////////////////////////////////////////////////////////////////// +namespace +{ +struct NonDefaultFromJsonStruct { }; + +inline bool operator== (NonDefaultFromJsonStruct const& lhs, NonDefaultFromJsonStruct const& rhs) +{ + return true; +} + +enum class for_1647 { one, two }; + +NLOHMANN_JSON_SERIALIZE_ENUM(for_1647, +{ + {for_1647::one, "one"}, + {for_1647::two, "two"}, +}) +} + +namespace nlohmann +{ +template <> +struct adl_serializer +{ + static NonDefaultFromJsonStruct from_json (json const& j) + { + return {}; + } +}; +} TEST_CASE("regression tests") { @@ -1820,6 +1852,12 @@ TEST_CASE("regression tests") CHECK(j.contains(jptr1)); CHECK(j.contains(jptr2)); } + + SECTION("issue #1647 - compile error when deserializing enum if both non-default from_json and non-member operator== exists for other type") + { + auto val = nlohmann::json("one").get(); + CHECK(val == for_1647::one); + } } #if not defined(JSON_NOEXCEPTION)