diff --git a/CHANGELOG.md b/CHANGELOG.md index c819bb79..31b21688 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Fixed invalid conversion error in `operator|(JsonVariant, char*)` (issue #1432) + v6.17.1 (2020-11-07) ------- diff --git a/extras/tests/JsonVariant/or.cpp b/extras/tests/JsonVariant/or.cpp index f28e2d8e..4b07862f 100644 --- a/extras/tests/JsonVariant/or.cpp +++ b/extras/tests/JsonVariant/or.cpp @@ -137,6 +137,20 @@ TEST_CASE("JsonVariant::operator|()") { REQUIRE(result == "not default"); } + SECTION("const char* | char*") { + char dflt[] = "default"; + variant.set("not default"); + std::string result = variant | dflt; + REQUIRE(result == "not default"); + } + + SECTION("int | char*") { + char dflt[] = "default"; + variant.set(42); + std::string result = variant | dflt; + REQUIRE(result == "default"); + } + SECTION("const char* | int") { variant.set("not default"); int result = variant | 42; diff --git a/src/ArduinoJson/Variant/VariantOperators.hpp b/src/ArduinoJson/Variant/VariantOperators.hpp index df4e9df2..c793210a 100644 --- a/src/ArduinoJson/Variant/VariantOperators.hpp +++ b/src/ArduinoJson/Variant/VariantOperators.hpp @@ -19,15 +19,23 @@ CompareResult compare(const T1 &lhs, const T2 &rhs); // VariantCompare.cpp template struct VariantOperators { // Returns the default value if the VariantRef is undefined or incompatible + // + // int operator|(JsonVariant, int) + // float operator|(JsonVariant, float) + // bool operator|(JsonVariant, bool) + // const char* operator|(JsonVariant, const char*) + // char* operator|(JsonVariant, const char*) template - friend typename enable_if::value, T>::type operator|( - const TVariant &variant, T defaultValue) { + friend typename enable_if::value, + typename VariantAs::type>::type + operator|(const TVariant &variant, T defaultValue) { if (variant.template is()) return variant.template as(); else return defaultValue; } - // Returns the default value if the VariantRef is undefined or incompatible + // + // JsonVariant operator|(JsonVariant, JsonVariant) template friend typename enable_if::value, typename T::variant_type>::type operator|(const TVariant &variant, T defaultValue) {