From 5234c8124b955373d81d4bdc9e45b0a3f6625a2e Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 18 Feb 2021 08:48:10 +0100 Subject: [PATCH] Removed `JsonVariant::as()` (fixes #1498) --- CHANGELOG.md | 16 ++++++++++++++++ extras/tests/FailingBuilds/CMakeLists.txt | 4 ++++ extras/tests/FailingBuilds/variant_as_char.cpp | 12 ++++++++++++ extras/tests/JsonVariant/types.cpp | 3 --- src/ArduinoJson/Variant/VariantAs.hpp | 3 ++- src/ArduinoJson/Variant/VariantRef.hpp | 14 ++++++++++++++ 6 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 extras/tests/FailingBuilds/variant_as_char.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 51d2d967..eebcb0c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,22 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Removed `JsonVariant::as()` (issue #1498) + +> ### BREAKING CHANGE +> +> We cannot cast a `JsonVariant` to a `char` anymore, so the following will break: +> ```c++ +> char age = doc["age"]; // error: no matching function for call to 'variantAs(VariantData*&)' +> ``` +> Instead, you must use another integral type, such as `int8_t`: +> ```c++ +> int8_t age = doc["age"]; // OK +> ``` + v6.17.3 (2021-02-15) ------- diff --git a/extras/tests/FailingBuilds/CMakeLists.txt b/extras/tests/FailingBuilds/CMakeLists.txt index 20bb4b90..19fdb23b 100644 --- a/extras/tests/FailingBuilds/CMakeLists.txt +++ b/extras/tests/FailingBuilds/CMakeLists.txt @@ -39,3 +39,7 @@ build_should_fail(write_long_long) add_executable(delete_jsondocument delete_jsondocument.cpp) build_should_fail(delete_jsondocument) + +add_executable(variant_as_char variant_as_char.cpp) +build_should_fail(variant_as_char) + diff --git a/extras/tests/FailingBuilds/variant_as_char.cpp b/extras/tests/FailingBuilds/variant_as_char.cpp new file mode 100644 index 00000000..9f321877 --- /dev/null +++ b/extras/tests/FailingBuilds/variant_as_char.cpp @@ -0,0 +1,12 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2021 +// MIT License + +#include + +// See issue #1498 + +int main() { + DynamicJsonDocument doc(1024); + doc["dummy"].as(); +} diff --git a/extras/tests/JsonVariant/types.cpp b/extras/tests/JsonVariant/types.cpp index bfe04544..0bc66078 100644 --- a/extras/tests/JsonVariant/types.cpp +++ b/extras/tests/JsonVariant/types.cpp @@ -68,9 +68,6 @@ TEST_CASE("JsonVariant set()/get()") { SECTION("Float") { checkNumericType(); } - SECTION("Char") { - checkNumericType(); - } SECTION("SChar") { checkNumericType(); } diff --git a/src/ArduinoJson/Variant/VariantAs.hpp b/src/ArduinoJson/Variant/VariantAs.hpp index 2446932a..f011cbd1 100644 --- a/src/ArduinoJson/Variant/VariantAs.hpp +++ b/src/ArduinoJson/Variant/VariantAs.hpp @@ -53,7 +53,8 @@ struct VariantConstAs { // --- template -inline typename enable_if::value && !is_same::value, +inline typename enable_if::value && !is_same::value && + !is_same::value, T>::type variantAs(const VariantData* data) { ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED(T); diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index a5c6444e..48a89ec6 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -251,6 +251,20 @@ class VariantRef : public VariantRefBase, template FORCE_INLINE typename VariantAs::type as() const { + /******************************************************************** + ** THIS IS NOT A BUG IN THE LIBRARY ** + ** -------------------------------- ** + ** Get a compilation error pointing here? ** + ** It doesn't mean the error *is* here. ** + ** Often, it's because you try to extract the wrong value type. ** + ** ** + ** For example: ** + ** char* name = doc["name"]; ** + ** char age = doc["age"]; ** + ** Instead, use: ** + ** const char* name = doc["name"]; ** + ** int8_t age = doc["age"]; ** + ********************************************************************/ return variantAs::type>(_data, _pool); }