https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89381

            Bug ID: 89381
           Summary: Implicit copy constructor cannot be generated after
                    unrelated class definition
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Keywords: diagnostic, needs-reduction, rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nok.raven at gmail dot com
  Target Milestone: ---

For some reason `bar` makes `foo` not copy-constructible. It compiles if
you remove `bar`, or force compiler to generate copy-constructor before
`bar` definition.

#include <variant>

struct foo : std::variant<long, int>
{
    using std::variant<long, int>::variant;
    using std::variant<long, int>::operator=;
};

//using workaround = decltype(foo{*static_cast<foo const*>(0)});

struct bar
{
    bar& operator=(foo ve)
    {
        value = std::move(ve);
        return *this;
    }

    foo value;
};


int main()
{
    foo a;
    foo b{a};
}


prog.cc: In function 'int main()':
prog.cc:26:12: error: use of deleted function 'constexpr foo::foo(const foo&)'
   26 |     foo b{a};
      |            ^
prog.cc:3:8: note: 'constexpr foo::foo(const foo&)' is implicitly declared as
deleted because 'foo' declares a move constructor or move assignment operator
    3 | struct foo : std::variant<long, int>
      |        ^~~
1

https://godbolt.org/z/DylgFW

Reply via email to