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

Reply via email to