On 5/12/25 4:32 PM, Ville Voutilainen wrote:
This function is yet another stdlib function that is just a simple cast, so
having
it appear while debugging is arguably not useful. So add it to the existing
handling
that always-folds some stdlib functions.
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++/ChangeLog:
* include/std/utility (to_underlying): Add the __always_inline__
attribute.
/* 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 (id_equal (DECL_NAME (callee), "to_underlying")
+ || (INDIRECT_TYPE_P (TREE_TYPE (x))
+ && INDIRECT_TYPE_P (TREE_TYPE (r))))
Maybe instead of INDIRECT_TYPE_P, check ! AGGREGATE_TYPE_P ? I'm not
sure how much sanity checking we need here, maybe we should just trust
the library.
+#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::move" "gimple" } }
+// { dg-final { scan-tree-dump-not "= std::forward" "gimple" } }
+// { 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" } }
+// { dg-final { scan-tree-dump-not "= std::to_underlying" "gimple" } }
Why check for a lot of things that aren't used in the testcase?
Jason