Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
-- >8 --
We reject this test with
error: default argument '^^a' uses local variable 'a'
However: [dcl.fct.default]/9: "A parameter shall not appear as
a potentially-evaluated expression in a default argument.", and
[expr.reflect]/7: "The id-expression of a reflect-expression
is an unevaluated operand."
We still have to look at REFLECT_EXPRs in check_out_of_consteval_use_r
though, otherwise it wouldn't work too well.
PR c++/123608
gcc/cp/ChangeLog:
* cp-tree.h (unevaluated_p): Include REFLECT_EXPR.
* reflect.cc (check_out_of_consteval_use_r): Don't give up early
on REFLECT_EXPR_P.
gcc/testsuite/ChangeLog:
* g++.dg/reflect/defarg1.C: New test.
---
gcc/cp/cp-tree.h | 7 ++++---
gcc/cp/reflect.cc | 2 +-
gcc/testsuite/g++.dg/reflect/defarg1.C | 8 ++++++++
3 files changed, 13 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/reflect/defarg1.C
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 2384affd776..b1291c269d7 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -9515,8 +9515,8 @@ is_constrained_auto (const_tree t)
}
/* True if CODE, a tree code, denotes a tree whose operand is not evaluated
- as per [expr.context], i.e., an operand to sizeof, typeof, decltype, or
- alignof. */
+ as per [expr.context], i.e., an operand to sizeof, typeof, decltype,
+ alignof, or the id-expression of a reflect-expression. */
inline bool
unevaluated_p (tree_code code)
@@ -9525,7 +9525,8 @@ unevaluated_p (tree_code code)
|| code == ALIGNOF_EXPR
|| code == SIZEOF_EXPR
|| code == NOEXCEPT_EXPR
- || code == REQUIRES_EXPR);
+ || code == REQUIRES_EXPR
+ || code == REFLECT_EXPR);
}
/* RAII class to push/pop the access scope for T. */
diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index e90c9e376b1..09b0632a619 100644
--- a/gcc/cp/reflect.cc
+++ b/gcc/cp/reflect.cc
@@ -8118,7 +8118,7 @@ check_out_of_consteval_use_r (tree *tp, int
*walk_subtrees, void *pset)
/* No need to look into types or unevaluated operands. */
if (TYPE_P (t)
- || unevaluated_p (TREE_CODE (t))
+ || (unevaluated_p (TREE_CODE (t)) && !REFLECT_EXPR_P (t))
/* Don't walk INIT_EXPRs, because we'd emit bogus errors about
member initializers. */
|| TREE_CODE (t) == INIT_EXPR
diff --git a/gcc/testsuite/g++.dg/reflect/defarg1.C
b/gcc/testsuite/g++.dg/reflect/defarg1.C
new file mode 100644
index 00000000000..87ec0b5e969
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/defarg1.C
@@ -0,0 +1,8 @@
+// PR c++/123608
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+#include <meta>
+
+consteval bool f(int a, std::meta::info b = ^^a) { return is_variable(b); }
+static_assert(f(42));
base-commit: a8290fb163443276c3df6b20024c6874f93c560c
--
2.53.0