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

--- Comment #5 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:89100826acec92dfaa6ab8f2646b8053e7dbc67c

commit r11-6874-g89100826acec92dfaa6ab8f2646b8053e7dbc67c
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Jan 21 16:12:28 2021 -0500

    c++: ICE with noexcept in class in member function [PR96623]

    I discovered very strange code in inject_parm_decls:

       if (args && is_this_parameter (args))
         {
           gcc_checking_assert (current_class_ptr == NULL_TREE);
           current_class_ptr = NULL_TREE;

    We are tripping up on the assert because when we call inject_parm_decls,
    current_class_ptr is set to 'A'.  It was set by inject_this_parameter
    after we've parsed the parameter-declaration-clause of the member
    function foo.  It seems correct to set ccp/ccr to A::B when we're
    late parsing the noexcept-specifiers of bar* functions in B, so that
    this-> does the right thing.  Since inject_parm_decls doesn't expect
    to see non-null ccp/ccr, reset it before calling inject_parm_decls.

    gcc/cp/ChangeLog:

            PR c++/96623
            * parser.c (inject_parm_decls): Remove a redundant assignment.
            (cp_parser_class_specifier_1): Clear current_class_{ptr,ref}
            before calling inject_parm_decls.

    gcc/testsuite/ChangeLog:

            PR c++/96623
            * g++.dg/cpp0x/noexcept64.C: New test.

Reply via email to