https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106223
Bug ID: 106223 Summary: difference in behaviour between no optimization and -O for specialization of std::forward Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: nimrodcowboy at gmail dot com Target Milestone: --- Consider the following C++17 code, I make a specialization of std::forward for user-defined type A. #include <iostream> #include <utility> struct A{ constexpr A(int val) : val(val) {} int val = 0; }; namespace std { template<> A&& forward(A& a) noexcept { a.val += 1; return std::move(a); } template<> constexpr A& forward(A& a) noexcept { a.val += 1; return a; } } void foo(A a) { std::cout << a.val << "\n"; } template <typename T> void f(T&& arg) { foo(std::forward<T>(arg)); } int main() { A a{1}; f(a); f(std::move(a)); } Output: no optimization: 2 3 -O: 1 1 See https://godbolt.org/z/sMKdEj1d5 It seems a regression introduced in GCC 12. I believe it's not UB, since it's legal to do so in C++17.