[Bug c++/94231] New: Invalid move constructor defaulted outside of class as deleted is accepted

herring at lanl dot gov gcc-bugzilla@gcc.gnu.org
Fri Mar 20 00:08:04 GMT 2020


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.


More information about the Gcc-bugs mailing list