From 0e7262a77b2458dddd472f4261fd470d1188e308 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Fri, 26 Jan 2024 18:45:12 +0100 Subject: [PATCH] Improve error messages when using `char` or `char*` See #2043 Ported from 650d537b5dae6ed1f8e051f3fda1da632e8a7094 --- CHANGELOG.md | 5 +++++ extras/tests/JsonVariant/converters.cpp | 19 +++++++++++-------- src/ArduinoJson/Variant/ConverterImpl.hpp | 10 ++++++++++ src/ArduinoJson/Variant/VariantRefBase.hpp | 8 +++----- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f47083a..1758f310 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Improve error messages when using `char` or `char*` (issue #2043) + v6.21.5 (2024-01-10) ------- diff --git a/extras/tests/JsonVariant/converters.cpp b/extras/tests/JsonVariant/converters.cpp index 89afc9b7..4cca990d 100644 --- a/extras/tests/JsonVariant/converters.cpp +++ b/extras/tests/JsonVariant/converters.cpp @@ -154,15 +154,18 @@ TEST_CASE("ConverterNeedsWriteableRef") { } namespace ArduinoJson { -void convertToJson(char c, JsonVariant var) { - char buf[] = {c, 0}; - var.set(buf); -} +template <> +struct Converter { + static void toJson(char c, JsonVariant var) { + char buf[] = {c, 0}; + var.set(buf); + } -void convertFromJson(JsonVariantConst src, char& dst) { - auto p = src.as(); - dst = p ? p[0] : 0; -} + static char fromJson(JsonVariantConst src) { + auto p = src.as(); + return p ? p[0] : 0; + } +}; } // namespace ArduinoJson TEST_CASE("Convert char to string") { // issue #1922 diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index 0708f52f..364d5723 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -20,6 +20,10 @@ ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE template struct Converter { + static_assert(!detail::is_same::value, + "type 'char' is not supported, use 'signed char', 'unsigned " + "char' or another integer type instead"); + static void toJson(const T& src, JsonVariant dst) { // clang-format off convertToJson(src, dst); // Error here? See https://arduinojson.org/v6/unsupported-set/ @@ -27,6 +31,9 @@ struct Converter { } static T fromJson(JsonVariantConst src) { + static_assert(!detail::is_same::value, + "type 'char*' is not supported, use 'const char*' instead"); + // clang-format off T result; // Error here? See https://arduinojson.org/v6/non-default-constructible/ convertFromJson(src, result); // Error here? See https://arduinojson.org/v6/unsupported-as/ @@ -35,6 +42,9 @@ struct Converter { } static bool checkJson(JsonVariantConst src) { + static_assert(!detail::is_same::value, + "type 'char*' is not supported, use 'const char*' instead"); + T dummy = T(); // clang-format off return canConvertFromJson(src, dummy); // Error here? See https://arduinojson.org/v6/unsupported-is/ diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index 3f29608a..d0daa0ca 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/src/ArduinoJson/Variant/VariantRefBase.hpp @@ -95,11 +95,9 @@ class VariantRefBase : public VariantTag { // Returns true if the value is of the specified type. // https://arduinojson.org/v6/api/jsonvariant/is/ template - FORCE_INLINE typename enable_if::value && - !is_same::value && - !is_same::value, - bool>::type - is() const { + FORCE_INLINE + typename enable_if::value, bool>::type + is() const { return Converter::checkJson(getVariantConst()); }