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

--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:bca467e56fe111fa6d876656c60d5704065e83fe

commit r11-6848-gbca467e56fe111fa6d876656c60d5704065e83fe
Author: Marek Polacek <pola...@redhat.com>
Date:   Tue Jan 12 16:16:44 2021 -0500

    c++: ICE with delayed noexcept and attribute used [PR97966]

    Another ICE with delayed noexcept parsing, but a bit gnarlier.

    A function definition marked with __attribute__((used)) ought to be
    emitted even when it is not referenced in the TU.  For a member function
    template marked with __attribute__((used)) this means that it will
    be instantiated: in instantiate_class_template_1 we have

    11971               /* Instantiate members marked with attribute used.  */
    11972               if (r != error_mark_node && DECL_PRESERVE_P (r))
    11973                 mark_used (r);

    It is not so surprising that this doesn't work well with delayed
    noexcept parsing: when we're processing the function template we delay
    the parsing, so the member "foo" is found, but then when we're
    instantiating it, "foo" hasn't yet been seen, which creates a
    discrepancy and a crash ensues.  "foo" hasn't yet been seen because
    instantiate_class_template_1 just loops over the class members and
    instantiates right away.

    To make it work, this patch uses a vector to keep track of members
    marked with attribute used and uses it to instantiate such members
    only after we're done with the class; in particular, after we have
    called finish_member_declaration for each member.  And we ought to
    be verifying that we did emit such members, so I've added a bunch
    of dg-finals.

    gcc/cp/ChangeLog:

            PR c++/97966
            * pt.c (instantiate_class_template_1): Instantiate members
            marked with attribute used only after we're done instantiating
            the class.

    gcc/testsuite/ChangeLog:

            PR c++/97966
            * g++.dg/cpp0x/noexcept63.C: New test.

Reply via email to