[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