The explicit cast is necessary even though the value for
t is passed in as an r-value, because it becomes an l-value as soon as it is assigned to the variable.
Without the change in libc++ the updated test fails with:
In file included from tests/stl/stl_utility.cpp:1: share/libc++/utility:58:12: error: rvalue reference to type 'int' cannot bind to lvalue of type 'typename remove_reference<int>::type' (aka 'int') return t; ^ tests/stl/stl_utility.cpp:18:20: note: in instantiation of function template specialization 'std::forward<int>' requested here int && xr = std::forward<int>(x + 1); ^ code generation aborted due to one compilation error
The change follows the implementation in LLVM libcxx: https://github.com/llvm/llvm-project/blob/abfa950d86da1737/libcxx/include/__utility/forward.h#L35