https://gcc.gnu.org/g:9de2f8da0c37f04d67bc3d5dcee6a36034df2f9a
commit r16-7242-g9de2f8da0c37f04d67bc3d5dcee6a36034df2f9a Author: Marek Polacek <[email protected]> Date: Sun Feb 1 15:20:55 2026 -0500 c++/reflection: wrong error with const meta::info parm [PR123614] 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. Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/cvt.cc | 9 +++++---- gcc/testsuite/g++.dg/reflect/parm5.C | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/gcc/cp/cvt.cc b/gcc/cp/cvt.cc index a984611ea8e2..fe9b9dc6dd18 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 000000000000..0034b842cc62 --- /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)); +}
