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

--- Comment #6 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:e1fd040884ab7ac36ca5555ab5822bcb5e51e8d8

commit r10-6149-ge1fd040884ab7ac36ca5555ab5822bcb5e51e8d8
Author: Marek Polacek <pola...@redhat.com>
Date:   Tue Jan 21 17:38:54 2020 -0500

    PR c++/92907 - noexcept does not consider "const" in member functions.

    Here the problem is that if the noexcept specifier is used in the context
    of a const member function, const is not considered for the member
variables,
    leading to a bogus error.  g's const makes its 'this' const, so the first
    overload of f should be selected.

    In cp_parser_noexcept_specification_opt we inject 'this', but always
    unqualified:
    25737           if (current_class_type)
    25738             inject_this_parameter (current_class_type,
TYPE_UNQUALIFIED);
    so we need to pass the function's qualifiers down here.  In
    cp_parser_direct_declarator it's easy: use the just parsed cv_quals, in
    cp_parser_late_noexcept_specifier look at the 'this' parameter to figure it
    out.

    2020-01-22  Marek Polacek  <pola...@redhat.com>

        PR c++/92907 - noexcept does not consider "const" in member functions.
        * parser.c (cp_parser_lambda_declarator_opt): Pass the proper
        qualifiers to cp_parser_exception_specification_opt.
        (cp_parser_direct_declarator): Pass the function qualifiers to
        cp_parser_exception_specification_opt.
        (cp_parser_class_specifier_1): Pass the function declaration to
        cp_parser_late_noexcept_specifier.
        (cp_parser_late_noexcept_specifier): Add a tree parameter.  Use it to
        pass the qualifiers of the function to
        cp_parser_noexcept_specification_opt.
        (cp_parser_noexcept_specification_opt): New cp_cv_quals parameter.
        Use it in inject_this_parameter.
        (cp_parser_exception_specification_opt): New cp_cv_quals parameter.
        Use it.
        (cp_parser_transaction): Pass TYPE_UNQUALIFIED to
        cp_parser_noexcept_specification_opt.
        (cp_parser_transaction_expression): Likewise.

        * g++.dg/cpp0x/noexcept56.C: New test.

Reply via email to