On 1/29/26 4:32 PM, Jakub Jelinek wrote:
On Wed, Jan 28, 2026 at 05:10:18PM -0500, Marek Polacek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

-- >8 --
As discussed in
<https://gcc.gnu.org/pipermail/gcc-patches/2026-January/705756.html>,
we should check TYPE_BEING_DEFINED along with COMPLETE_TYPE_P in
eval_define_aggregate.  It seems that with this check added, we don't
need this code anymore:

       if (c == type)
         {
           auto_diagnostic_group d;
           error_at (loc, "%<define_aggregate%> evaluated from "
                          "%<consteval%> block enclosed by %qT being "
                          "defined", type);
          //...
        }

but I'm not removing that in this patch.

Why not?

gcc/cp/ChangeLog:

        * reflect.cc (eval_define_aggregate): Also give an error when
        TYPE_BEING_DEFINED is true for the first argument.

gcc/testsuite/ChangeLog:

        * g++.dg/reflect/define_aggregate3.C: Adjust expected diagnostic.
        * g++.dg/reflect/p2996-21.C: Likewise.
---
  gcc/cp/reflect.cc                                |  8 ++++++++
  gcc/testsuite/g++.dg/reflect/define_aggregate3.C | 16 ++++++++--------
  gcc/testsuite/g++.dg/reflect/p2996-21.C          |  4 ++--
  3 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index bdeec2f0f38..4845e648fdf 100644
--- a/gcc/cp/reflect.cc
+++ b/gcc/cp/reflect.cc
@@ -5896,6 +5896,14 @@ eval_define_aggregate (location_t loc, const 
constexpr_ctx *ctx,
        *non_constant_p = true;
        return call;
      }
+  if (TYPE_BEING_DEFINED (type))
+    {
+      if (!cxx_constexpr_quiet_p (ctx))
+       error_at (loc, "first %<define_aggregate%> argument is a reflection "
+                      "of a class type being defined");

I wonder if this message shouldn't mention the type like the diagnostics
that is obsoleted by this.
While in cases like S3 it is obvious, sometimes the define_aggregate might
be in a consteval call with completely different locus and figuring out
what is the type being defined might be harder.

Please.

Jason

Reply via email to