[Bug c++/106223] New: difference in behaviour between no optimization and -O for specialization of std::forward
nimrodcowboy at gmail dot com
gcc-bugzilla@gcc.gnu.org
Thu Jul 7 08:37:52 GMT 2022
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.
More information about the Gcc-bugs
mailing list