[Bug c++/96137] [11 Regression] GCC hang on in invalid function definition

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Jan 29 04:30:14 GMT 2021


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

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

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

commit r11-6967-gf8f5388c9e94d4324c31d82b335fa138518e3171
Author: Marek Polacek <polacek@redhat.com>
Date:   Thu Jan 28 22:18:32 2021 -0500

    c++: Fix infinite looping with invalid operator [PR96137]

    My r11-86 adjusted cp_parser_class_name to do

    -  scope = parser->scope;
    +  scope = parser->scope ? parser->scope : parser->context->object_type;
       if (scope == error_mark_node)
         return error_mark_node;

    but that caused endless looping in cp_parser_type_specifier_seq (the
    while (true) loop) in this invalid test, because we never set a parser
    error, therefore cp_parser_type_specifier returned error_mark_node
    instead of NULL_TREE, and we never issued the "expected type-specifier"
    error.

    At first I thought I'd just add cp_parser_simulate_error right before
    the return, but that regresses crash81.C -- we'd emit multiple errors
    for "T::X".  So the next best thing seemed to revert to pre-r11-86
    behavior: return early when parser->scope is bad, otherwise proceed to
    get the parser error.

    gcc/cp/ChangeLog:

            PR c++/96137
            * parser.c (cp_parser_class_name): If parser->scope is
            error_mark_node, return it, otherwise continue.

    gcc/testsuite/ChangeLog:

            PR c++/96137
            * g++.dg/parse/error63.C: New test.


More information about the Gcc-bugs mailing list