]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Remove non leaf errors
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Fri, 28 Nov 2025 18:52:25 +0000 (19:52 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Wed, 3 Dec 2025 12:26:04 +0000 (13:26 +0100)
gcc/rust/ChangeLog:

* parse/rust-parse-impl.h (Parser::parse_function): Return a nullptr on
error instead of a valid function.
(Parser::parse_let_stmt): Remove non leaf error.
(Parser::parse_if_expr): Likewise.
(Parser::parse_loop_expr): Likewise.
(Parser::parse_expr): Return error on null denotation error.

gcc/testsuite/ChangeLog:

* rust/compile/braced_macro_arm.rs: Remove parent errors.
* rust/compile/issue-407-2.rs: Likewise.
* rust/compile/issue-407.rs: Likewise.
* rust/compile/issue-4162.rs: Likewise.
* rust/compile/issue-867.rs: Likewise.
* rust/compile/raw_ref_op_invalid.rs: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/parse/rust-parse-impl.h
gcc/testsuite/rust/compile/braced_macro_arm.rs
gcc/testsuite/rust/compile/issue-407-2.rs
gcc/testsuite/rust/compile/issue-407.rs
gcc/testsuite/rust/compile/issue-4162.rs
gcc/testsuite/rust/compile/issue-867.rs
gcc/testsuite/rust/compile/raw_ref_op_invalid.rs

index 42e0044288461522935b695a06c9fd6eebf7b169..6cb8f0e6579a3684b6e6e7be35e3db7543afb271 100644 (file)
@@ -1855,15 +1855,7 @@ Parser<ManagedTokenSource>::parse_macro_invocation_semi (
       std::unique_ptr<AST::TokenTree> tree = parse_token_tree ();
 
       if (tree == nullptr)
-       {
-         Error error (t->get_locus (),
-                      "failed to parse token tree for macro invocation semi "
-                      "- found %qs",
-                      t->get_token_description ());
-         add_error (std::move (error));
-
-         return nullptr;
-       }
+       return nullptr;
 
       token_trees.push_back (std::move (tree));
 
@@ -2999,8 +2991,9 @@ Parser<ManagedTokenSource>::parse_function (AST::Visibility vis,
   else
     {
       std::unique_ptr<AST::BlockExpr> block_expr = parse_block_expr ();
-      if (block_expr != nullptr)
-       body = std::move (block_expr);
+      if (block_expr == nullptr)
+       return nullptr;
+      body = std::move (block_expr);
     }
 
   return std::unique_ptr<AST::Function> (
@@ -6226,10 +6219,6 @@ Parser<ManagedTokenSource>::parse_let_stmt (AST::AttrVec outer_attrs,
       expr = parse_expr ();
       if (expr == nullptr)
        {
-         Error error (lexer.peek_token ()->get_locus (),
-                      "failed to parse expression in let statement");
-         add_error (std::move (error));
-
          skip_after_semicolon ();
          return nullptr;
        }
@@ -7256,11 +7245,7 @@ Parser<ManagedTokenSource>::parse_block_expr (
       ExprOrStmt expr_or_stmt = parse_stmt_or_expr ();
       if (expr_or_stmt.is_error ())
        {
-         Error error (
-           t->get_locus (),
-           "failed to parse statement or expression in block expression");
-         add_error (std::move (error));
-
+         skip_after_end_block ();
          return nullptr;
        }
 
@@ -7783,14 +7768,7 @@ Parser<ManagedTokenSource>::parse_if_expr (AST::AttrVec outer_attrs,
   // parse required block expr
   std::unique_ptr<AST::BlockExpr> if_body = parse_block_expr ();
   if (if_body == nullptr)
-    {
-      Error error (lexer.peek_token ()->get_locus (),
-                  "failed to parse if body block expression in if expression");
-      add_error (std::move (error));
-
-      // skip somewhere?
-      return nullptr;
-    }
+    return nullptr;
 
   // branch to parse end or else (and then else, else if, or else if let)
   if (lexer.peek_token ()->get_id () != ELSE)
@@ -8113,13 +8091,7 @@ Parser<ManagedTokenSource>::parse_loop_expr (AST::AttrVec outer_attrs,
   // parse loop body, which is required
   std::unique_ptr<AST::BlockExpr> loop_body = parse_block_expr ();
   if (loop_body == nullptr)
-    {
-      Error error (lexer.peek_token ()->get_locus (),
-                  "could not parse loop body in (infinite) loop expression");
-      add_error (std::move (error));
-
-      return nullptr;
-    }
+    return nullptr;
 
   return std::unique_ptr<AST::LoopExpr> (
     new AST::LoopExpr (std::move (loop_body), locus, std::move (label),
@@ -12198,6 +12170,8 @@ Parser<ManagedTokenSource>::parse_expr (int right_binding_power,
   // parse null denotation (unary part of expression)
   std::unique_ptr<AST::Expr> expr
     = null_denotation ({}, null_denotation_restrictions);
+  if (expr == nullptr)
+    return nullptr;
 
   return left_denotations (std::move (expr), right_binding_power,
                           std::move (outer_attrs), restrictions);
index 9bcd1a69c9fb5ebf071bc02a16f9613cd3c7ef13..8782cf9f94f82138e5bb188c1766bf349f87554e 100644 (file)
@@ -7,11 +7,9 @@ macro_rules! m {
 
 fn h(c: bool) {
     match c {
-        // { dg-error "failed to parse statement or expression in block expression" "" { target *-*-* } .-1 }
         true => m! {}
         false => ()
         // { dg-error "exprwithoutblock requires comma after match case expression in match arm \\(if not final case\\)" "" { target *-*-* } .-1 }
-        // { dg-error "unrecognised token .false. for start of item" "" { target *-*-* } .-2 }
     };
 }
 
index 002d998a95eb0bdf955855dd828f6577ec815085..6dad8612f218806682cc8259f2fff03805cd130c 100644 (file)
@@ -2,14 +2,8 @@
 pub fn loopy()  {
     let mut a = 1;
     loop {
-        // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-1 }
         if a < 40 {
-            // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-1 }
             a + = 1; // { dg-error "found unexpected token '=' in null denotation" }
-            // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-1 }
-            // { dg-error {failed to parse if body block expression in if expression} "" { target *-*-* } .-2 }
-            // { dg-error {could not parse loop body in \(infinite\) loop expression} "" { target *-*-* } .-3 }
-            // { dg-error {unrecognised token 'integer literal' for start of item} "" { target *-*-* } .-4 }
         } else {
             break;
         }
index 9188c2c6b07de3512fffec50fd944ad67473fd88..3a9dbeba900a84a5ff73441c7e8d0e913d956441 100644 (file)
@@ -2,6 +2,4 @@
 fn test()  {
     let mut a = 1;
     a + = 1; // { dg-error "found unexpected token '=' in null denotation" }
-    // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-1 }
-    // { dg-error {unrecognised token 'integer literal' for start of item} "" { target *-*-* } .-2 }
 }
index 7caf8870c05d37a36660ddbc43dd2fc6e632022b..ffaa92d9761597848b1f5d2a6fb49400669f7829 100644 (file)
@@ -1,8 +1,6 @@
 pub fn main() {
     while let  = 5
     // { dg-error "should be at least 1 pattern" "" { target *-*-* } .-1 }
-    // { dg-error "failed to parse statement or expression in block expression" "" { target *-*-* } .-2 }
-    // { dg-error "unrecognised token .=. for start of item" "" { target *-*-* } .-3 }
     {}
 }
 
index c61de09d8abbc69198fa3012eb0ea22089857dad..1aa29b3ed10c6dd82cf242004704ca0ce8ef368e 100644 (file)
@@ -1,7 +1,4 @@
 fn main() {
     let _ = 42;
     let a = _ + 123; // { dg-error "use of '_' is not allowed on the right-side of an assignment" }
-                     // { dg-error {failed to parse expression in let statement} "" { target *-*-* } .-1  }
-                     // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-2 }
-                     // { dg-error {unrecognised token '\}' for start of item} "" { target *-*-* } .+1 }
 }
index 90e169f30f6b1f222614dafa205a8824fc343ce2..42ec63d7365860ac5f3c8fb72a89c0ac8881322b 100644 (file)
@@ -7,6 +7,4 @@ pub struct Toto {
 
 pub fn test(mut toto: Toto) {
     let _c = &raw toto.u; //{ dg-error "expecting .;. but .identifier. found" "" { target *-*-* }  }
-    //{ dg-excess-errors "Additional errors for parent items" { target *-*-* } }
-
 }