aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-08-06 11:51:45 -0400
committerPatrick Palka <ppalka@redhat.com>2024-08-06 11:51:45 -0400
commit180625ae72b3f733813a360fae4f0d6ce79eccdc (patch)
tree31ff30c40a6c8e0bd3746b984267b59d25e8075f
parentaf1010268f81fc891a6bbf8ed9d5b8a3b5ce44cb (diff)
downloadgcc-180625ae72b3f733813a360fae4f0d6ce79eccdc.zip
gcc-180625ae72b3f733813a360fae4f0d6ce79eccdc.tar.gz
gcc-180625ae72b3f733813a360fae4f0d6ce79eccdc.tar.bz2
c++: fold calls to std::forward_like [PR96780]
This extends our folding of cast-like standard library functions to also include C++23's std::forward_like. PR c++/96780 gcc/cp/ChangeLog: * cp-gimplify.cc (cp_fold) <case CALL_EXPR>: Fold calls to std::forward_like as well. gcc/testsuite/ChangeLog: * g++.dg/opt/pr96780.C: Also test std::forward_like folding. Reviewed-by: Marek Polacek <mpolacek@redhat.com> Reviewed-by: Jason Merrill <jason@redhat.com>
-rw-r--r--gcc/cp/cp-gimplify.cc1
-rw-r--r--gcc/testsuite/g++.dg/opt/pr96780.C5
2 files changed, 6 insertions, 0 deletions
diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc
index b88c3b7..0c589ee 100644
--- a/gcc/cp/cp-gimplify.cc
+++ b/gcc/cp/cp-gimplify.cc
@@ -3313,6 +3313,7 @@ cp_fold (tree x, fold_flags_t flags)
&& DECL_NAME (callee) != NULL_TREE
&& (id_equal (DECL_NAME (callee), "move")
|| id_equal (DECL_NAME (callee), "forward")
+ || id_equal (DECL_NAME (callee), "forward_like")
|| id_equal (DECL_NAME (callee), "addressof")
/* This addressof equivalent is used heavily in libstdc++. */
|| id_equal (DECL_NAME (callee), "__addressof")
diff --git a/gcc/testsuite/g++.dg/opt/pr96780.C b/gcc/testsuite/g++.dg/opt/pr96780.C
index 61e1185..a29cda8 100644
--- a/gcc/testsuite/g++.dg/opt/pr96780.C
+++ b/gcc/testsuite/g++.dg/opt/pr96780.C
@@ -29,6 +29,10 @@ void f() {
auto&& x11 = std::as_const(a);
auto&& x12 = std::as_const(ca);
#endif
+#if __cpp_lib_forward_like
+ auto&& x13 = std::forward_like<int&&>(a);
+ auto&& x14 = std::forward_like<int&&>(ca);
+#endif
}
// { dg-final { scan-tree-dump-not "= std::move" "gimple" } }
@@ -36,3 +40,4 @@ void f() {
// { dg-final { scan-tree-dump-not "= std::addressof" "gimple" } }
// { dg-final { scan-tree-dump-not "= std::__addressof" "gimple" } }
// { dg-final { scan-tree-dump-not "= std::as_const" "gimple" } }
+// { dg-final { scan-tree-dump-not "= std::forward_like" "gimple" } }