]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Make *_cast<*> parsing more robust to errors [PR108438]
authorSimon Martin <simon@nasilyan.com>
Fri, 7 Jun 2024 09:21:07 +0000 (11:21 +0200)
committerSimon Martin <simon@nasilyan.com>
Sat, 8 Jun 2024 11:08:12 +0000 (13:08 +0200)
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.

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.

gcc/cp/parser.cc
gcc/testsuite/g++.dg/parse/crash75.C [new file with mode: 0644]

index bc4a23591539f291de4a961a5875c7649628f964..9f43a7768891e968981d8a277db869a534928f1b 100644 (file)
@@ -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 (file)
index 0000000..81a16e3
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/108438
+// { dg-options "-Wlogical-not-parentheses" }
+
+template <typename T>
+T foo (T arg, T& ref, T* ptr)
+{
+  int a = 1;
+  return static_cast<T!>(a); // { dg-error "expected" }
+}