mpark / variant

C++17 `std::variant` for C++11/14/17
https://mpark.github.io/variant
Boost Software License 1.0
659 stars 88 forks source link

gcc 9 warns about implicitly-declared operator= being deprecated #65

Closed ZedThree closed 4 years ago

ZedThree commented 5 years ago
Scanning dependencies of target assign.copy
[ 24%] Building CXX object test/CMakeFiles/assign.copy.dir/assign.copy.cpp.o
In file included from /data/mpark/variant/test/assign.copy.cpp:8:
/data/mpark/variant/include/mpark/variant.hpp: In member function ‘mpark::variant<Ts>& mpark::variant<Ts>::operator=(const mpark::variant<Ts>&) [with Ts = {Assign_Copy_SameType_Test::TestBody()::Obj, int}]’:
/data/mpark/variant/include/mpark/variant.hpp:1553:9: error: implicitly-declared ‘mpark::detail::impl<Assign_Copy_SameType_Test::TestBody()::Obj, int>& mpark::detail::impl<Assign_Copy_SameType_Test::TestBody()::Obj, int>::operator=(const mpark::detail::impl<Assign_Copy_SameType_Test::TestBody()::Obj, int>&)’ is deprecated [-Werror=deprecated-copy]
 1553 |   class variant {
      |         ^~~~~~~
/data/mpark/variant/include/mpark/variant.hpp:1424:26: note: because ‘mpark::detail::impl<Assign_Copy_SameType_Test::TestBody()::Obj, int>’ has user-provided ‘mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>& mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>::operator=(const mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>&) [with Ts = {Assign_Copy_SameType_Test::TestBody()::Obj, int}]’
 1424 |         copy_assignment &operator=(const copy_assignment &that) {
      |                          ^~~~~~~~
/data/mpark/variant/include/mpark/variant.hpp:1414:5: note: in definition of macro ‘MPARK_VARIANT_COPY_ASSIGNMENT’
 1414 |     definition                                                           \
      |     ^~~~~~~~~~
/data/mpark/variant/test/assign.copy.cpp: In member function ‘virtual void Assign_Copy_SameType_Test::TestBody()’:
/data/mpark/variant/test/assign.copy.cpp:25:7: note: synthesized method ‘mpark::variant<Ts>& mpark::variant<Ts>::operator=(const mpark::variant<Ts>&) [with Ts = {Assign_Copy_SameType_Test::TestBody()::Obj, int}]’ first required here
   25 |   v = w;
      |       ^
In file included from /data/mpark/variant/test/assign.copy.cpp:8:
/data/mpark/variant/include/mpark/variant.hpp: In member function ‘mpark::variant<Ts>& mpark::variant<Ts>::operator=(const mpark::variant<Ts>&) [with Ts = {Assign_Copy_DiffType_Test::TestBody()::Obj, int}]’:
/data/mpark/variant/include/mpark/variant.hpp:1553:9: error: implicitly-declared ‘mpark::detail::impl<Assign_Copy_DiffType_Test::TestBody()::Obj, int>& mpark::detail::impl<Assign_Copy_DiffType_Test::TestBody()::Obj, int>::operator=(const mpark::detail::impl<Assign_Copy_DiffType_Test::TestBody()::Obj, int>&)’ is deprecated [-Werror=deprecated-copy]
 1553 |   class variant {
      |         ^~~~~~~
/data/mpark/variant/include/mpark/variant.hpp:1424:26: note: because ‘mpark::detail::impl<Assign_Copy_DiffType_Test::TestBody()::Obj, int>’ has user-provided ‘mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>& mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>::operator=(const mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>&) [with Ts = {Assign_Copy_DiffType_Test::TestBody()::Obj, int}]’
 1424 |         copy_assignment &operator=(const copy_assignment &that) {
      |                          ^~~~~~~~
/data/mpark/variant/include/mpark/variant.hpp:1414:5: note: in definition of macro ‘MPARK_VARIANT_COPY_ASSIGNMENT’
 1414 |     definition                                                           \
      |     ^~~~~~~~~~
/data/mpark/variant/test/assign.copy.cpp: In member function ‘virtual void Assign_Copy_DiffType_Test::TestBody()’:
/data/mpark/variant/test/assign.copy.cpp:39:7: note: synthesized method ‘mpark::variant<Ts>& mpark::variant<Ts>::operator=(const mpark::variant<Ts>&) [with Ts = {Assign_Copy_DiffType_Test::TestBody()::Obj, int}]’ first required here
   39 |   v = w;
      |       ^
cc1plus: all warnings being treated as errors

Removing the type noise, you get:

mpark/variant.hpp: In member function ‘variant<Ts>& variant<Ts>::operator=(const variant<Ts>&) [with Ts = {type_list}]’:
mpark/variant.hpp:1553:9: warning: implicitly-declared ‘impl& impl::operator=(const impl&)’ is deprecated [-Wdeprecated-copy]
 1553 |   class variant {
      |         ^~~~~~~
mpark/variant.hpp:1424:26: note: because ‘impl’ has user-provided ‘copy_assigment<Ts>& copy_assigment<Ts>::operator=(const copy_assigment<Ts>&) [with Ts = {type_list}]’
 1424 |         copy_assignment &operator=(const copy_assignment &that) {
      |                          ^~~~~~~~
mpark/variant.hpp:1414:5: note: in definition of macro ‘MPARK_VARIANT_COPY_ASSIGNMENT’
 1414 |     definition                                                           \
      |     ^~~~~~~~~~

Which seems strange because copy_assignment has a copy constructor:

    MPARK_INHERITING_CTOR(copy_assignment, super)                        \
    using super::operator=;                                              \
                                                                         \
    copy_assignment(const copy_assignment &) = default;                  \
    copy_assignment(copy_assignment &&) = default;                       \
    ~copy_assignment() = default;                                        \
    definition                                                           \
    copy_assignment &operator=(copy_assignment &&) = default;            \
phlptp commented 4 years ago

I am getting the same warning on GCC 9 that I don't fully understand the reasoning

/root/project/build/include/helics_cxx/helics/external/variant.hpp: In member function 'mpark::variant<Ts>& mpark::variant<Ts>::operator=(const mpark::variant<Ts>&) [with Ts = {double, long int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::complex<double>, std::vector<double, std::allocator<double> >, std::vector<std::complex<double>, std::allocator<std::complex<double> > >, helics::NamedPoint}]':
/root/project/build/include/helics_cxx/helics/external/variant.hpp:2181:9: warning: implicitly-declared 'mpark::detail::impl<double, long int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::complex<double>, std::vector<double, std::allocator<double> >, std::vector<std::complex<double>, std::allocator<std::complex<double> > >, helics::NamedPoint>& mpark::detail::impl<double, long int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::complex<double>, std::vector<double, std::allocator<double> >, std::vector<std::complex<double>, std::allocator<std::complex<double> > >, helics::NamedPoint>::operator=(const mpark::detail::impl<double, long int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::complex<double>, std::vector<double, std::allocator<double> >, std::vector<std::complex<double>, std::allocator<std::complex<double> > >, helics::NamedPoint>&)' is deprecated [-Wdeprecated-copy]
 2181 |   class variant {
      |         ^~~~~~~
/root/project/build/include/helics_cxx/helics/external/variant.hpp:2052:26: note: because 'mpark::detail::impl<double, long int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::complex<double>, std::vector<double, std::allocator<double> >, std::vector<std::complex<double>, std::allocator<std::complex<double> > >, helics::NamedPoint>' has user-provided 'mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>& mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>::operator=(const mpark::detail::copy_assignment<mpark::detail::traits<Ts ...>, mpark::detail::Trait::Available>&) [with Ts = {double, long int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::complex<double>, std::vector<double, std::allocator<double> >, std::vector<std::complex<double>, std::allocator<std::complex<double> > >, helics::NamedPoint}]'
 2052 |         copy_assignment &operator=(const copy_assignment &that) {
      |                          ^~~~~~~~
/root/project/build/include/helics_cxx/helics/external/variant.hpp:2042:5: note: in definition of macro 'MPARK_VARIANT_COPY_ASSIGNMENT'
 2042 |     definition                                                           \
      |     ^~~~~~~~~~
/root/project/src/helics/apps/Player.cpp: In member function 'virtual void helics::apps::Player::loadJsonFile(const string&)':
/root/project/src/helics/apps/Player.cpp:566:36: note: synthesized method 'mpark::variant<Ts>& mpark::variant<Ts>::operator=(const mpark::variant<Ts>&) [with Ts = {double, long int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::complex<double>, std::vector<double, std::allocator<double> >, std::vector<std::complex<double>, std::allocator<std::complex<double> > >, helics::NamedPoint}]' first required here
  566 |             points.back ().value = val;

points.back().value and val are both the same variant type.

subramanyakrishna commented 1 year ago

How did you solve this error @ZedThree @phlptp ?