diff --git a/CHANGELOG.md b/CHANGELOG.md index 17616d1c..f91b4036 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ HEAD * Added `BasicJsonDocument::garbageCollect()` (issue #1195) * Added `StaticJsonDocument::garbageCollect()` * Changed copy-constructor of `BasicJsonDocument` to preserve the capacity of the source. +* Removed copy-constructor of `JsonDocument` (issue #1189) > ### BREAKING CHANGES > @@ -37,6 +38,23 @@ HEAD > I made this change to get consistent results between copy-constructor and move-constructor, and whether RVO applies or not. > > If you use the copy-constructor to optimize your documents, you can use `garbageCollect()` or `shrinkToFit()` instead. +> +> #### Copy-constructor of `JsonDocument` +> +> In previous versions, it was possible to create a function that take a `JsonDocument` by value. +> +> ```c++ +> void myFunction(JsonDocument doc) {} +> ``` +> +> This function gives the wrong clues because it doesn't receive a copy of the `JsonDocument`, only a sliced version. +> It worked because the copy constructor copied the internal pointers, but it was an accident. +> +> From now, if you need to pass a `JsonDocument` to a function, you must use a reference: +> +> ```c++ +> void myFunction(JsonDocument& doc) {} +> ``` v6.14.1 (2020-01-27) ------- diff --git a/extras/tests/Misc/CMakeLists.txt b/extras/tests/Misc/CMakeLists.txt index bd26bb2e..cba9a586 100644 --- a/extras/tests/Misc/CMakeLists.txt +++ b/extras/tests/Misc/CMakeLists.txt @@ -20,23 +20,35 @@ set_target_properties(MiscTests PROPERTIES UNITY_BUILD OFF) add_test(Misc MiscTests) +macro(build_should_fail target) + set_target_properties(${target} + PROPERTIES + EXCLUDE_FROM_ALL TRUE + EXCLUDE_FROM_DEFAULT_BUILD TRUE + ) + add_test( + NAME + ${target} + COMMAND + ${CMAKE_COMMAND} --build . --target ${target} --config $ + WORKING_DIRECTORY + ${CMAKE_BINARY_DIR} + ) + set_tests_properties(${target} + + + + PROPERTIES + WILL_FAIL TRUE) +endmacro() + add_executable(Issue978 Issue978.cpp ) -set_target_properties(Issue978 - PROPERTIES - EXCLUDE_FROM_ALL TRUE - EXCLUDE_FROM_DEFAULT_BUILD TRUE +build_should_fail(Issue978) + +add_executable(Issue1189 + Issue1189.cpp ) -add_test( - NAME - Issue978 - COMMAND - ${CMAKE_COMMAND} --build . --target Issue978 --config $ - WORKING_DIRECTORY - ${CMAKE_BINARY_DIR} -) -set_tests_properties(Issue978 - PROPERTIES - WILL_FAIL TRUE) +build_should_fail(Issue1189) diff --git a/extras/tests/Misc/Issue1189.cpp b/extras/tests/Misc/Issue1189.cpp new file mode 100644 index 00000000..b3832a32 --- /dev/null +++ b/extras/tests/Misc/Issue1189.cpp @@ -0,0 +1,13 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2020 +// MIT License + +#include + +// a function should not be able to get a JsonDocument by value +void f(JsonDocument) {} + +int main() { + DynamicJsonDocument doc(1024); + f(doc); +} diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 242d801a..cad93318 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -319,6 +319,10 @@ class JsonDocument : public Visitable { MemoryPool _pool; VariantData _data; + + private: + JsonDocument(const JsonDocument&); + JsonDocument& operator=(const JsonDocument&); }; } // namespace ARDUINOJSON_NAMESPACE