On 2/2/26 5:19 AM, Marek Polacek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
OK.
-- >8 --
Here we issue a bogus "not a constant expression" error ultimately
because get_info returns NULL_TREE for the const parameter in Name.
The cxx_eval_constant_expression in get_info produces a NOP_EXPR:
(info) reflect_expr <int>
which is not REFLECT_EXPR_P. This isn't caught by the
REFLECTION_TYPE_P && REFLECT_EXPR_P check in _eval_constant_expression
because OP is a NOP_EXPR. The NOP_EXPR comes from adjust_temp_type.
I suppose I could just add STRIP_NOPS to get_info. Or I could follow
c++/65695 / r6-41-gfb899e32c16088 and adjust cp_fold_convert to fold
away the conversion.
PR c++/123614
gcc/cp/ChangeLog:
* cvt.cc (cp_fold_convert): Avoid wrapping a REFLECT_EXPR in NOP_EXPR.
gcc/testsuite/ChangeLog:
* g++.dg/reflect/parm5.C: New test.
---
gcc/cp/cvt.cc | 9 +++++----
gcc/testsuite/g++.dg/reflect/parm5.C | 17 +++++++++++++++++
2 files changed, 22 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/reflect/parm5.C
diff --git a/gcc/cp/cvt.cc b/gcc/cp/cvt.cc
index a984611ea8e..fe9b9dc6dd1 100644
--- a/gcc/cp/cvt.cc
+++ b/gcc/cp/cvt.cc
@@ -622,11 +622,12 @@ cp_fold_convert (tree type, tree expr)
tree conv;
if (TREE_TYPE (expr) == type)
conv = expr;
- else if (TREE_CODE (expr) == PTRMEM_CST
- && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
- PTRMEM_CST_CLASS (expr)))
+ else if ((TREE_CODE (expr) == PTRMEM_CST
+ && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
+ PTRMEM_CST_CLASS (expr)))
+ || (REFLECT_EXPR_P (expr) && REFLECTION_TYPE_P (type)))
{
- /* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */
+ /* Avoid wrapping a PTRMEM_CST/REFLECT_EXPR in NOP_EXPR. */
conv = copy_node (expr);
TREE_TYPE (conv) = type;
}
diff --git a/gcc/testsuite/g++.dg/reflect/parm5.C
b/gcc/testsuite/g++.dg/reflect/parm5.C
new file mode 100644
index 00000000000..0034b842cc6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/parm5.C
@@ -0,0 +1,17 @@
+// PR c++/123614
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+#include <meta>
+
+template<class, class> struct same_type;
+template<class T> struct same_type<T, T> {};
+
+consteval auto Name(const std::meta::info meta){
+ same_type<decltype(meta), const std::meta::info>();
+ return std::meta::display_string_of(meta);
+}
+
+int main() {
+ auto sv = std::define_static_string(Name(^^int));
+}
base-commit: e7853d31dd723eb8a1cb5ce34fad638fd255d9a8