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

--- Comment #10 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Jakub Jelinek
<ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:1b6045c3c4fe0a0024abe9215ced2e4a2ac55fd2

commit r13-9595-g1b6045c3c4fe0a0024abe9215ced2e4a2ac55fd2
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Mar 6 18:26:37 2025 +0100

    c++: Update TYPE_FIELDS of variant types if
cp_parser_late_parsing_default_args etc. modify it [PR98533]

    The following testcases ICE during type verification, because TYPE_FIELDS
    of e.g. S RECORD_TYPE in pr119123.C is different from TYPE_FIELDS of const
S.
    Various decls are added to S's TYPE_FIELDS first, then finish_struct
    indirectly calls fixup_type_variants to sync the variant copies.
    But later on cp_parser_class_specifier calls
    cp_parser_late_parsing_default_args and that apparently adds a lambda
    type (from default argument) to TYPE_FIELDS of S.
    Dunno if that is right or not, assuming it is right, the following
    patch fixes it by updating TYPE_FIELDS of variant types if there were
    any changes in the various functions cp_parser_class_specifier defers and
    calls on the outermost enclosing class.
    There was quite a lot of code repetition already before, so the patch
    uses a lambda to avoid the repetitions.
    To my surprise, in some of the contract testcases (
    g++.dg/contracts/contracts-friend1.C
    g++.dg/contracts/contracts-nested-class1.C
    g++.dg/contracts/contracts-nested-class2.C
    g++.dg/contracts/contracts-redecl7.C
    g++.dg/contracts/contracts-redecl8.C
    ) it is actually setting class_type and pushing TRANSLATION_UNIT_DECL
    rather than some class types in some cases.

    Or should the lambda pushing into the containing class be somehow avoided?

    2025-03-06  Jakub Jelinek  <ja...@redhat.com>

            PR c++/98533
            PR c++/119123
            * parser.cc (cp_parser_class_specifier): Update TYPE_FIELDS of
            variant types in case cp_parser_late_parsing_default_args etc.
change
            TYPE_FIELDS on the main variant.  Add switch_to_class lambda and
            use it to simplify repeated class switching code.

            * g++.dg/cpp0x/pr98533.C: New test.
            * g++.dg/cpp0x/pr119123.C: New test.

    (cherry picked from commit 179e01085b0aed111ef1f7908c4b87c800f880e9)

Reply via email to