https://gcc.gnu.org/g:2c9643c27ecddb7f597d34009d89e932b4aca58e

commit r15-1114-g2c9643c27ecddb7f597d34009d89e932b4aca58e
Author: Simon Martin <si...@nasilyan.com>
Date:   Fri Jun 7 11:21:07 2024 +0200

    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 <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.

Diff:
---
 gcc/cp/parser.cc                     | 2 +-
 gcc/testsuite/g++.dg/parse/crash75.C | 9 +++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

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 <typename T>
+T foo (T arg, T& ref, T* ptr)
+{
+  int a = 1;
+  return static_cast<T!>(a); // { dg-error "expected" }
+}

Reply via email to