c++: Fix infinite looping with invalid operator [PR96137]
authorMarek Polacek <polacek@redhat.com>
Fri, 29 Jan 2021 03:18:32 +0000 (22:18 -0500)
committerMarek Polacek <polacek@redhat.com>
Fri, 29 Jan 2021 04:29:35 +0000 (23:29 -0500)
commitf8f5388c9e94d4324c31d82b335fa138518e3171
tree747ad1787e1b30432c63d55b245abb2cac5e06aa
parent85d04a2ecb75fb67f2d72f0ff2a34cee92acd7b8
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.
gcc/cp/parser.c
gcc/testsuite/g++.dg/parse/error63.C [new file with mode: 0644]