From: Simon Martin Date: Fri, 7 Jun 2024 09:21:07 +0000 (+0200) Subject: c++: Make *_cast<*> parsing more robust to errors [PR108438] X-Git-Tag: basepoints/gcc-16~8439 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c9643c27ecddb7f597d34009d89e932b4aca58e;p=thirdparty%2Fgcc.git c++: Make *_cast<*> parsing more robust to errors [PR108438] We ICE upon the following when trying to emit a -Wlogical-not-parentheses warning: === cut here === template T foo (T arg, T& ref, T* ptr) { int a = 1; return static_cast(a); } === cut here === This patch makes *_cast<*> parsing more robust by skipping to the closing '>' upon error in the target type. Successfully tested on x86_64-pc-linux-gnu. PR c++/108438 gcc/cp/ChangeLog: * parser.cc (cp_parser_postfix_expression): Use cp_parser_require_end_of_template_parameter_list to skip to the closing '>' upon error parsing the target type of *_cast<*> expressions. gcc/testsuite/ChangeLog: * g++.dg/parse/crash75.C: New test. --- diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index bc4a2359153..9f43a776889 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -7569,7 +7569,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, NULL); parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p; /* Look for the closing `>'. */ - cp_parser_require (parser, CPP_GREATER, RT_GREATER); + cp_parser_require_end_of_template_parameter_list (parser); /* Restore the old message. */ parser->type_definition_forbidden_message = saved_message; diff --git a/gcc/testsuite/g++.dg/parse/crash75.C b/gcc/testsuite/g++.dg/parse/crash75.C new file mode 100644 index 00000000000..81a16e35b14 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash75.C @@ -0,0 +1,9 @@ +// PR c++/108438 +// { dg-options "-Wlogical-not-parentheses" } + +template +T foo (T arg, T& ref, T* ptr) +{ + int a = 1; + return static_cast(a); // { dg-error "expected" } +}