From: Marc Poulhiès <d...@kataplop.net>

Fix crash (segfault) on a missing closing parenthesis when parsing the
expressions in a block. The returned `expr` was missing a check before being
used.

Add corresponding test.

Signed-off-by: Marc Poulhiès <d...@kataplop.net>

gcc/rust/ChangeLog:

        * parse/rust-parse-impl.h (Parser::parse_stmt_or_expr_without_block):
        Check if `expr` is valid after parsing it.

gcc/testsuite/ChangeLog:

        * rust/compile/missing_closing_paren.rs: New test.
---
 gcc/rust/parse/rust-parse-impl.h                  | 15 +++++++++++----
 .../rust/compile/missing_closing_paren.rs         |  3 +++
 2 files changed, 14 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/missing_closing_paren.rs

diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 72207a1bc22..a4a912f8c1d 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -11738,10 +11738,17 @@ 
Parser<ManagedTokenSource>::parse_stmt_or_expr_without_block ()
            // must be expression statement
            lexer.skip_token ();
 
-           std::unique_ptr<AST::ExprStmtWithoutBlock> stmt (
-             new AST::ExprStmtWithoutBlock (std::move (expr),
-                                            t->get_locus ()));
-           return ExprOrStmt (std::move (stmt));
+           if (expr)
+             {
+               std::unique_ptr<AST::ExprStmtWithoutBlock> stmt (
+                 new AST::ExprStmtWithoutBlock (std::move (expr),
+                                                t->get_locus ()));
+               return ExprOrStmt (std::move (stmt));
+             }
+           else
+             {
+               return ExprOrStmt::create_error ();
+             }
          }
 
        // return expression
diff --git a/gcc/testsuite/rust/compile/missing_closing_paren.rs 
b/gcc/testsuite/rust/compile/missing_closing_paren.rs
new file mode 100644
index 00000000000..895c3133c3b
--- /dev/null
+++ b/gcc/testsuite/rust/compile/missing_closing_paren.rs
@@ -0,0 +1,3 @@
+fn foo() {
+    (""; // { dg-error "unexpected token .*" }
+}
-- 
2.39.1

Reply via email to