https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113064
Bug ID: 113064 Summary: assignement from temporary sometimes invokes copy-assign instead of move-assign operator Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: m.cencora at gmail dot com Target Milestone: --- Following code fails to compile on any gcc version with any selected language version. Works with clang. When invoking the conversion operator the problem does not occur. Also the mere existence of second overloaded conversion operator is problematic. Even though this conversion operator does not participate in overload resolution due to being && qualified. I marked it as deleted to show that this is not the overload being chosen by compiler but just declaring it normally is enough to trigger the bug. Compilation fails with error: <source>: In function 'void test()': <source>:31:10: error: use of deleted function 'no_copy& no_copy::operator=(const no_copy&)' 31 | nc = f; | ^ <source>:9:14: note: declared here 9 | no_copy& operator=(const no_copy&) = delete; | ^~~~~~~~ Compiler returned: 1 // test.cpp struct no_copy { no_copy() = default; no_copy(const no_copy&) = delete; no_copy(no_copy&&); no_copy& operator=(const no_copy&) = delete; no_copy& operator=(no_copy&&); }; struct foo { operator no_copy() & { return no_copy(); } #ifndef WORKAROUND1 operator no_copy&&() && = delete; #endif }; void test() { foo f; no_copy nc; #ifndef WORKAROUND2 nc = f; #else nc = f.operator bar(); #endif }