https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104046
Bug ID: 104046 Summary: C++ compiler should forbid throw move-only type Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: fsb4000 at yandex dot ru Target Milestone: --- Hello. We were reported a bug: https://github.com/microsoft/STL/issues/2466 But we think that the report is wrong. Code: #include <exception> #include <string> using namespace std; class C { public: C() = default; C(const C&) = delete; C& operator=(const C&) = delete; C(C&&) = default; C& operator=(C&&) = default; private: string m; }; int main() { exception_ptr eptr; try { throw C(); } catch (const C&) { eptr = std::current_exception(); } try { rethrow_exception(eptr); } catch (const C&) { } } godbolt: https://godbolt.org/z/GKTGbjbvK We think that C++ compiler should reject the program because the program violates [except.throw]/5: https://eel.is/c++draft/except.throw#5 Quote: "When the thrown object is a class object, the constructor selected for the copy-initialization as well as the constructor selected for a copy-initialization considering the thrown object as an lvalue shall be non-deleted and accessible, even if the copy/move operation is elided" We decided to notify developers of other C++ compilers too.