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.