https://gcc.gnu.org/g:101f2970adc0a7ac5785e40eb8ad63facb4f582a

commit r16-7140-g101f2970adc0a7ac5785e40eb8ad63facb4f582a
Author: Marek Polacek <[email protected]>
Date:   Wed Jan 28 17:30:06 2026 -0500

    c++/reflection: enhance splice error checking
    
    As discussed in
    <https://gcc.gnu.org/pipermail/gcc-patches/2026-January/705756.html>:
    
    > Absolutely, I mean anything other than REFLECT_EXPR or error_mark_node
    > should be an error.
    
    I'm not giving another error for error_mark_node since we've already
    complained (but make sure we have).
    
    gcc/cp/ChangeLog:
    
            * reflect.cc (class_members_of): Adjust comment.
            (splice): Give an error if the expression doesn't evaluate to
            a REFLECT_EXPR_P.
    
    Reviewed-by: Jason Merrill <[email protected]>

Diff:
---
 gcc/cp/reflect.cc | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index 8acac9f8f0ea..4174c2ef8553 100644
--- a/gcc/cp/reflect.cc
+++ b/gcc/cp/reflect.cc
@@ -6564,7 +6564,7 @@ class_members_of (location_t loc, const constexpr_ctx 
*ctx, tree r,
     {
       tree m = field;
       if (TREE_CODE (field) == FIELD_DECL && DECL_ARTIFICIAL (field))
-       continue; /* Ignore bases.  */
+       continue; /* Ignore bases and the vptr.  */
       else if (DECL_SELF_REFERENCE_P (field))
        continue;
       else if (TREE_CODE (field) == TYPE_DECL)
@@ -7992,9 +7992,17 @@ splice (tree refl)
     refl = fold_non_dependent_expr (refl, tf_warning_or_error, true);
   else
     refl = cxx_constant_value (refl);
+  if (refl == error_mark_node)
+    {
+      gcc_checking_assert (seen_error ());
+      return error_mark_node;
+    }
   if (!REFLECT_EXPR_P (refl))
-    /* I don't wanna do your dirty work no more.  */
-    return error_mark_node;
+    {
+      error_at (cp_expr_loc_or_input_loc (refl), "splice argument must be an "
+               "expression of type %qs", "std::meta::info");
+      return error_mark_node;
+    }
 
   /* We are bringing some entity from the unevaluated expressions world
      to possibly outside of that, mark it used.  */

Reply via email to