mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 23:25:24 +02:00
Add std::to_underlying to the set of stdlib functions that are always folded
gcc/cp/ChangeLog: * cp-gimplify.cc (cp_fold): Add to_underlying. gcc/testsuite/ChangeLog: * g++.dg/opt/pr96780_cpp23.C: New. libstdc++-v3/ChangeLog: * include/std/utility (to_underlying): Add the __always_inline__ attribute. Signed-off-by: Ville Voutilainen <ville.voutilainen@gmail.com>
This commit is contained in:
@@ -3343,19 +3343,16 @@ cp_fold (tree x, fold_flags_t flags)
|
||||
|| id_equal (DECL_NAME (callee), "addressof")
|
||||
/* This addressof equivalent is used heavily in libstdc++. */
|
||||
|| id_equal (DECL_NAME (callee), "__addressof")
|
||||
|| id_equal (DECL_NAME (callee), "to_underlying")
|
||||
|| id_equal (DECL_NAME (callee), "as_const")))
|
||||
{
|
||||
r = CALL_EXPR_ARG (x, 0);
|
||||
/* Check that the return and argument types are sane before
|
||||
folding. */
|
||||
if (INDIRECT_TYPE_P (TREE_TYPE (x))
|
||||
&& INDIRECT_TYPE_P (TREE_TYPE (r)))
|
||||
{
|
||||
if (!same_type_p (TREE_TYPE (x), TREE_TYPE (r)))
|
||||
r = build_nop (TREE_TYPE (x), r);
|
||||
x = cp_fold (r, flags);
|
||||
break;
|
||||
}
|
||||
if (!same_type_p (TREE_TYPE (x), TREE_TYPE (r)))
|
||||
r = build_nop (TREE_TYPE (x), r);
|
||||
x = cp_fold (r, flags);
|
||||
break;
|
||||
}
|
||||
|
||||
int sv = optimize, nw = sv;
|
||||
|
||||
16
gcc/testsuite/g++.dg/opt/pr96780_cpp23.C
Normal file
16
gcc/testsuite/g++.dg/opt/pr96780_cpp23.C
Normal file
@@ -0,0 +1,16 @@
|
||||
// PR c++/96780
|
||||
// Verify calls to std::move/forward are folded away by the frontend.
|
||||
// { dg-do compile { target c++23 } }
|
||||
// { dg-additional-options "-ffold-simple-inlines -fdump-tree-gimple" }
|
||||
|
||||
#include <utility>
|
||||
|
||||
enum class A : char {a};
|
||||
|
||||
extern A& x;
|
||||
|
||||
void f() {
|
||||
auto&& x1 = std::to_underlying(x);
|
||||
}
|
||||
|
||||
// { dg-final { scan-tree-dump-not "= std::to_underlying" "gimple" } }
|
||||
@@ -201,7 +201,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
#ifdef __cpp_lib_to_underlying // C++ >= 23
|
||||
/// Convert an object of enumeration type to its underlying type.
|
||||
template<typename _Tp>
|
||||
[[nodiscard]]
|
||||
[[nodiscard, __gnu__::__always_inline__]]
|
||||
constexpr underlying_type_t<_Tp>
|
||||
to_underlying(_Tp __value) noexcept
|
||||
{ return static_cast<underlying_type_t<_Tp>>(__value); }
|
||||
|
||||
Reference in New Issue
Block a user