From 5ab8589e09ccaf7d36c9331425fba9413f40b26b Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Thu, 3 Apr 2025 13:16:33 +0200 Subject: [PATCH] Change optional to expected for parse_loop_label gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_loop_label): Change function return type to expected. (Parser::parse_labelled_loop_expr): Adapt call location to new return type. * parse/rust-parse.h (enum class): Update function prototype. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/parse/rust-parse-impl.h | 18 ++++++++++++------ gcc/rust/parse/rust-parse.h | 8 +++++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 32177c5ce2c..073775eaf06 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -7568,14 +7568,15 @@ Parser::parse_continue_expr (AST::AttrVec outer_attrs, // Parses a loop label used in loop expressions. template -tl::optional +tl::expected Parser::parse_loop_label (const_TokenPtr tok) { // parse lifetime - if doesn't exist, assume no label if (tok->get_id () != LIFETIME) { // not necessarily an error - return tl::nullopt; + return tl::unexpected ( + ParseLoopLabelError::NOT_LOOP_LABEL); } /* FIXME: check for named lifetime requirement here? or check in semantic * analysis phase? */ @@ -7584,10 +7585,11 @@ Parser::parse_loop_label (const_TokenPtr tok) if (!skip_token (COLON)) { // skip somewhere? - return tl::nullopt; + return tl::unexpected ( + ParseLoopLabelError::MISSING_COLON); } - return tl::optional ( + return tl::expected ( AST::LoopLabel (std::move (label), tok->get_locus ())); } @@ -8217,8 +8219,8 @@ Parser::parse_labelled_loop_expr (const_TokenPtr tok, // parse loop label (required) // TODO: Convert this return type to tl::expected instead of tl::optional - tl::optional label = parse_loop_label (tok); - if (!label) + auto parsed_label = parse_loop_label (tok); + if (!parsed_label) { Error error (lexer.peek_token ()->get_locus (), "failed to parse loop label in labelled loop expr"); @@ -8228,6 +8230,10 @@ Parser::parse_labelled_loop_expr (const_TokenPtr tok, return nullptr; } + auto label = parsed_label + ? tl::optional (parsed_label.value ()) + : tl::nullopt; + // branch on next token const_TokenPtr t = lexer.peek_token (); switch (t->get_id ()) diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h index 5373106c189..ff7987930fb 100644 --- a/gcc/rust/parse/rust-parse.h +++ b/gcc/rust/parse/rust-parse.h @@ -33,6 +33,11 @@ class ParseLifetimeParamError class ParseLifetimeError { }; +enum class ParseLoopLabelError +{ + NOT_LOOP_LABEL, + MISSING_COLON, +}; enum ParseSelfError { SELF_PTR, @@ -620,7 +625,8 @@ private: std::unique_ptr parse_labelled_loop_expr (const_TokenPtr tok, AST::AttrVec outer_attrs = AST::AttrVec ()); - tl::optional parse_loop_label (const_TokenPtr tok); + tl::expected + parse_loop_label (const_TokenPtr tok); std::unique_ptr parse_async_block_expr (AST::AttrVec outer_attrs = AST::AttrVec ()); std::unique_ptr parse_grouped_expr (AST::AttrVec outer_attrs -- 2.47.2