Ver Fonte

Fixed invalid conversion in `operator|(Variant, char*)` (fixes #1432)

Benoit Blanchon há 5 anos atrás
pai
commit
30da920135

+ 5 - 0
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)
 -------
 

+ 14 - 0
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;

+ 12 - 4
src/ArduinoJson/Variant/VariantOperators.hpp

@@ -19,15 +19,23 @@ CompareResult compare(const T1 &lhs, const T2 &rhs);  // VariantCompare.cpp
 template <typename TVariant>
 struct VariantOperators {
   // Returns the default value if the VariantRef is undefined or incompatible
-  template <typename T>
-  friend typename enable_if<!IsVariant<T>::value, T>::type operator|(
-      const TVariant &variant, T defaultValue) {
+  //
+  // int operator|(JsonVariant, int)
+  // float operator|(JsonVariant, float)
+  // bool operator|(JsonVariant, bool)
+  // const char* operator|(JsonVariant, const char*)
+  // char* operator|(JsonVariant, const char*)
+  template <typename T>
+  friend typename enable_if<!IsVariant<T>::value,
+                            typename VariantAs<T>::type>::type
+  operator|(const TVariant &variant, T defaultValue) {
     if (variant.template is<T>())
       return variant.template as<T>();
     else
       return defaultValue;
   }
-  // Returns the default value if the VariantRef is undefined or incompatible
+  //
+  // JsonVariant operator|(JsonVariant, JsonVariant)
   template <typename T>
   friend typename enable_if<IsVariant<T>::value, typename T::variant_type>::type
   operator|(const TVariant &variant, T defaultValue) {