On 6/7/24 08:12, Simon Martin wrote:
We ICE upon the following when trying to emit a -Wlogical-not-parentheses
warning:

=== cut here ===
template <typename T> T foo (T arg, T& ref, T* ptr) {
   int a = 1;
   return static_cast<T!>(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.

(Note that I have a patch pending review that also adds g++.dg/parse/crash74.C;
I will obviously handle the name conflict at commit time)

        PR c++/108438

gcc/cp/ChangeLog:

        * parser.cc (cp_parser_postfix_expression): Skip to the closing '>'
        upon error parsing the target type of *_cast<*> expressions.

gcc/testsuite/ChangeLog:

        * g++.dg/parse/crash74.C: New test.

---
  gcc/cp/parser.cc                     | 3 ++-
  gcc/testsuite/g++.dg/parse/crash74.C | 9 +++++++++
  2 files changed, 11 insertions(+), 1 deletion(-)
  create mode 100644 gcc/testsuite/g++.dg/parse/crash74.C

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index bc4a2359153..3516c2aa38b 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -7569,7 +7569,8 @@ 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);
+       if (!cp_parser_require (parser, CPP_GREATER, RT_GREATER))
+         cp_parser_skip_to_end_of_template_parameter_list (parser);

Looks like this could use cp_parser_require_end_of_template_parameter_list.

OK with that change.

Jason

Reply via email to