From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id 209E03858436; Sun, 5 Mar 2023 11:42:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 209E03858436 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1678016535; bh=5jxU55eqcuNn08d/Z0d8/nxE4zQedViifdbRjpUWI44=; h=From:To:Subject:Date:From; b=NV/mg+eD0V/Xng5QNE/2ylScSBQeZYYLltZnMG2M5P3QbpJDmDkGjBuiCAebYht+y 5ULP4imQEfeAsRL/ZTuPVtkxi8eS2Lj9JWLw9QyBQ7lLoUThYp1KvkeoGLPKQ0o3N4 udVdHH9BM6lzi8olg3s1XvMQCE3mahvDuJlOzwVA= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] parser: Fix while let expr parsing X-Act-Checkin: gcc X-Git-Author: Pierre-Emmanuel Patry X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: 32a9736ef6ea85993a95cd038cf1712378172fb8 X-Git-Newrev: 26b19976c898dd08f7234dc179ad57085f974b1a Message-Id: <20230305114215.209E03858436@sourceware.org> Date: Sun, 5 Mar 2023 11:42:15 +0000 (GMT) List-Id: https://gcc.gnu.org/g:26b19976c898dd08f7234dc179ad57085f974b1a commit 26b19976c898dd08f7234dc179ad57085f974b1a Author: Pierre-Emmanuel Patry Date: Wed Mar 1 17:45:51 2023 +0100 parser: Fix while let expr parsing While let expr return unit but are valid construct in rust, they should therefore be included in the parsing code. Also add a new test to check parsing of while let expressions. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_while_let_loop_expr): Prevent hard error on token skip. (Parser::null_denotation): Fix parser for while let expressions. gcc/testsuite/ChangeLog: * rust/compile/while_let_expr.rs: New test. Signed-off-by: Pierre-Emmanuel Patry Diff: --- gcc/rust/parse/rust-parse-impl.h | 15 +++++++++++---- gcc/testsuite/rust/compile/while_let_expr.rs | 13 +++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index b17744fedaa..46704111f37 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -8372,7 +8372,7 @@ Parser::parse_while_let_loop_expr (AST::AttrVec outer_attrs, locus = lexer.peek_token ()->get_locus (); else locus = label.get_locus (); - skip_token (WHILE); + maybe_skip_token (WHILE); /* check for possible accidental recognition of a while loop as a while let * loop */ @@ -13114,9 +13114,16 @@ Parser::null_denotation (const_TokenPtr tok, return parse_loop_expr (std::move (outer_attrs), AST::LoopLabel::error (), tok->get_locus ()); case WHILE: - return parse_while_loop_expr (std::move (outer_attrs), - AST::LoopLabel::error (), - tok->get_locus ()); + if (lexer.peek_token ()->get_id () == LET) + { + return parse_while_let_loop_expr (std::move (outer_attrs)); + } + else + { + return parse_while_loop_expr (std::move (outer_attrs), + AST::LoopLabel::error (), + tok->get_locus ()); + } case MATCH_TOK: // also an expression with block return parse_match_expr (std::move (outer_attrs), tok->get_locus ()); diff --git a/gcc/testsuite/rust/compile/while_let_expr.rs b/gcc/testsuite/rust/compile/while_let_expr.rs new file mode 100644 index 00000000000..113ad743cc2 --- /dev/null +++ b/gcc/testsuite/rust/compile/while_let_expr.rs @@ -0,0 +1,13 @@ +// { dg-options "-fsyntax-only" } + +pub enum Option { + None, + Some(T), +} + +fn main() { + let mut x = Option::Some(3); + let a = while let Option::Some(1) = x { + x = Option::None; + }; +}