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

            Bug ID: 94231
           Summary: Invalid move constructor defaulted outside of class as
                    deleted is accepted
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: herring at lanl dot gov
  Target Milestone: ---

GCC incorrectly accepts the following:

  struct F {F(F&&)=delete;};

  template<int=0>
  struct M {
    F f;
    M();
    M(const M&);
    M(M&&);
  };

  template<int I>
  M<I>::M(M&&)=default;

  M<> f() {
    M<> m;
    return m;
  }

The returned value is implicitly moved-from (although adding static_cast<M<>&&>
makes no difference), which should discover that M's move constructor is
invalid because it is defaulted after its first declaration and defined as
deleted, but simply falls back to the copy constructor instead.

If M is not a template, GCC correctly rejects, although the error messages are
a bit confused.

Reply via email to