aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2021-07-21 22:41:04 +0200
committerPhilip Herron <philip.herron@embecosm.com>2021-07-22 11:17:45 +0100
commit1709592fbf4786eeb4ac86d19e9d8a0aea3692ea (patch)
treed5cbdda134b380c2612ed3c2b8af10d014db0c1d /gcc
parent6dfde8225f4184552aca9c614894ac13144c2298 (diff)
downloadgcc-1709592fbf4786eeb4ac86d19e9d8a0aea3692ea.zip
gcc-1709592fbf4786eeb4ac86d19e9d8a0aea3692ea.tar.gz
gcc-1709592fbf4786eeb4ac86d19e9d8a0aea3692ea.tar.bz2
unsafe blocks can be used in expressions
To use an unsafe block expression handle it in null_denotation for the pratt parser. Adjust parse_unsafe_block_expr to take a pratt_parse bool that defaults to false.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/parse/rust-parse-impl.h15
-rw-r--r--gcc/rust/parse/rust-parse.h5
2 files changed, 15 insertions, 5 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index eedc76d..bdf1e09 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -8704,10 +8704,17 @@ Parser<ManagedTokenSource>::parse_async_block_expr (AST::AttrVec outer_attrs)
// Parses an unsafe block expression.
template <typename ManagedTokenSource>
std::unique_ptr<AST::UnsafeBlockExpr>
-Parser<ManagedTokenSource>::parse_unsafe_block_expr (AST::AttrVec outer_attrs)
+Parser<ManagedTokenSource>::parse_unsafe_block_expr (AST::AttrVec outer_attrs,
+ bool pratt_parse)
{
- Location locus = lexer.peek_token ()->get_locus ();
- skip_token (UNSAFE);
+ Location locus;
+ if (!pratt_parse)
+ {
+ locus = lexer.peek_token ()->get_locus ();
+ skip_token (UNSAFE);
+ }
+ else
+ locus = lexer.peek_token ()->get_locus () - 1;
// parse block expression (required)
std::unique_ptr<AST::BlockExpr> block_expr = parse_block_expr ();
@@ -12823,6 +12830,8 @@ Parser<ManagedTokenSource>::null_denotation (const_TokenPtr tok,
case LEFT_SQUARE:
// array definition expr (not indexing)
return parse_array_expr (std::move (outer_attrs), true);
+ case UNSAFE:
+ return parse_unsafe_block_expr (std::move (outer_attrs), true);
default:
if (!restrictions.expr_can_be_null)
add_error (Error (tok->get_locus (),
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index 1cd85ea..1c7bd78 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -504,8 +504,6 @@ private:
AST::LoopLabel parse_loop_label ();
std::unique_ptr<AST::AsyncBlockExpr>
parse_async_block_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
- std::unique_ptr<AST::UnsafeBlockExpr>
- parse_unsafe_block_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
std::unique_ptr<AST::GroupedExpr> parse_grouped_expr (AST::AttrVec outer_attrs
= AST::AttrVec ());
std::unique_ptr<AST::ClosureExpr> parse_closure_expr (AST::AttrVec outer_attrs
@@ -522,6 +520,9 @@ private:
std::unique_ptr<AST::ContinueExpr>
parse_continue_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
bool pratt_parse = false);
+ std::unique_ptr<AST::UnsafeBlockExpr>
+ parse_unsafe_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
+ bool pratt_parse = false);
std::unique_ptr<AST::ArrayExpr> parse_array_expr (AST::AttrVec outer_attrs
= AST::AttrVec (),
bool pratt_parse = false);