https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98533

--- Comment #16 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
If the presence in TYPE_FIELDS is desirable, perhaps either we should repeat
fixup_type_variants (or just update TYPE_FIELDS on all variants manually) in
the
if (--parser->num_classes_being_defined == 0)
block.
Like following which fixes the ICE.
Perhaps we could turn those all if (class_type != whatever) blocks into a
lambda
taking whatever as argument so that we don't duplicate the code in so many
spots.
--- gcc/cp/parser.cc.jj 2025-02-27 22:04:36.007028112 +0100
+++ gcc/cp/parser.cc    2025-03-05 21:10:16.781237628 +0100
@@ -27718,6 +27718,7 @@ cp_parser_class_specifier (cp_parser* pa
     {
       tree decl;
       tree class_type = NULL_TREE;
+      tree class_type_fields = NULL_TREE;
       tree pushed_scope = NULL_TREE;
       unsigned ix;
       cp_default_arg_entry *e;
@@ -27748,9 +27749,14 @@ cp_parser_class_specifier (cp_parser* pa
             take care of them now.  */
          if (class_type != e->class_type)
            {
+             /* cp_parser_late_parsing_default_args could have changed
+                TYPE_FIELDS (class_type).  */
+             if (class_type && TYPE_FIELDS (class_type) != class_type_fields)
+               fixup_type_variants (class_type);
              if (pushed_scope)
                pop_scope (pushed_scope);
              class_type = e->class_type;
+             class_type_fields = TYPE_FIELDS (class_type);
              pushed_scope = push_scope (class_type);
            }
          /* Make sure that any template parameters are in scope.  */
@@ -27770,9 +27776,12 @@ cp_parser_class_specifier (cp_parser* pa
          tree ctx = DECL_CONTEXT (decl);
          if (class_type != ctx)
            {
+             if (class_type && TYPE_FIELDS (class_type) != class_type_fields)
+               fixup_type_variants (class_type);
              if (pushed_scope)
                pop_scope (pushed_scope);
              class_type = ctx;
+             class_type_fields = TYPE_FIELDS (class_type);
              pushed_scope = push_scope (class_type);
            }

@@ -27832,9 +27841,12 @@ cp_parser_class_specifier (cp_parser* pa
          tree ctx = type_context_for_name_lookup (decl);
          if (class_type != ctx)
            {
+             if (class_type && TYPE_FIELDS (class_type) != class_type_fields)
+               fixup_type_variants (class_type);
              if (pushed_scope)
                pop_scope (pushed_scope);
              class_type = ctx;
+             class_type_fields = TYPE_FIELDS (class_type);
              pushed_scope = push_scope (class_type);
            }
          inject_this_parameter (class_type, TYPE_UNQUALIFIED);
@@ -27848,9 +27860,12 @@ cp_parser_class_specifier (cp_parser* pa
          tree ctx = DECL_CONTEXT (decl);
          if (class_type != ctx)
            {
+             if (class_type && TYPE_FIELDS (class_type) != class_type_fields)
+               fixup_type_variants (class_type);
              if (pushed_scope)
                pop_scope (pushed_scope);
              class_type = ctx;
+             class_type_fields = TYPE_FIELDS (class_type);
              pushed_scope = push_scope (class_type);
            }

@@ -27891,6 +27906,9 @@ cp_parser_class_specifier (cp_parser* pa
        }
       vec_safe_truncate (unparsed_contracts, 0);

+      if (class_type && TYPE_FIELDS (class_type) != class_type_fields)
+       fixup_type_variants (class_type);
+
       current_class_ptr = NULL_TREE;
       current_class_ref = NULL_TREE;
       if (pushed_scope)

Reply via email to