aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/parse/rust-parse-impl.h
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2022-03-25 09:50:48 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2022-03-25 11:22:17 +0100
commit6c99a5a8f1a62976ff58d89034642f28128a2033 (patch)
tree552e0db021066676ec91f43242476edb1121b2ab /gcc/rust/parse/rust-parse-impl.h
parent2249a4d5125689e9012a866537bade963317fab8 (diff)
downloadgcc-6c99a5a8f1a62976ff58d89034642f28128a2033.zip
gcc-6c99a5a8f1a62976ff58d89034642f28128a2033.tar.gz
gcc-6c99a5a8f1a62976ff58d89034642f28128a2033.tar.bz2
parser: Move outer attrs properly intoto AssignmentExpr
AssignmentExpressions could not access their outer attributes properly, since they were being eagerly moved into the `IdentifierExpr` type they are based on. The base `OperatorExpr` class would thus end up with an empty vector of outer attributes
Diffstat (limited to 'gcc/rust/parse/rust-parse-impl.h')
-rw-r--r--gcc/rust/parse/rust-parse-impl.h17
1 files changed, 9 insertions, 8 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 7e6ab9b..1890745 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -11694,7 +11694,7 @@ Parser<ManagedTokenSource>::parse_stmt_or_expr_without_block ()
{
// should be expr without block
std::unique_ptr<AST::ExprWithoutBlock> expr
- = parse_expr_without_block ();
+ = parse_expr_without_block (std::move (outer_attrs));
if (lexer.peek_token ()->get_id () == SEMICOLON)
{
@@ -11739,7 +11739,7 @@ Parser<ManagedTokenSource>::parse_stmt_or_expr_without_block ()
// FIXME: old code was good until composability was required
// return parse_path_based_stmt_or_expr(std::move(outer_attrs));
std::unique_ptr<AST::ExprWithoutBlock> expr
- = parse_expr_without_block ();
+ = parse_expr_without_block (std::move (outer_attrs));
if (lexer.peek_token ()->get_id () == SEMICOLON)
{
@@ -11762,7 +11762,7 @@ Parser<ManagedTokenSource>::parse_stmt_or_expr_without_block ()
* expression then make it statement if semi afterwards */
std::unique_ptr<AST::ExprWithoutBlock> expr
- = parse_expr_without_block ();
+ = parse_expr_without_block (std::move (outer_attrs));
if (lexer.peek_token ()->get_id () == SEMICOLON)
{
@@ -12437,7 +12437,7 @@ Parser<ManagedTokenSource>::parse_expr (int right_binding_power,
// parse null denotation (unary part of expression)
std::unique_ptr<AST::Expr> expr
- = null_denotation (current_token, std::move (outer_attrs), restrictions);
+ = null_denotation (current_token, {}, restrictions);
if (expr == nullptr)
{
@@ -12452,8 +12452,8 @@ Parser<ManagedTokenSource>::parse_expr (int right_binding_power,
current_token = lexer.peek_token ();
lexer.skip_token ();
- expr = left_denotation (current_token, std::move (expr), AST::AttrVec (),
- restrictions);
+ expr = left_denotation (current_token, std::move (expr),
+ std::move (outer_attrs), restrictions);
if (expr == nullptr)
{
@@ -13786,7 +13786,7 @@ template <typename ManagedTokenSource>
std::unique_ptr<AST::AssignmentExpr>
Parser<ManagedTokenSource>::parse_assig_expr (
const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
- AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
+ AST::AttrVec outer_attrs, ParseRestrictions restrictions)
{
// parse RHS (as tok has already been consumed in parse_expression)
std::unique_ptr<AST::Expr> right
@@ -13799,7 +13799,8 @@ Parser<ManagedTokenSource>::parse_assig_expr (
Location locus = left->get_locus ();
return std::unique_ptr<AST::AssignmentExpr> (
- new AST::AssignmentExpr (std::move (left), std::move (right), locus));
+ new AST::AssignmentExpr (std::move (left), std::move (right),
+ std::move (outer_attrs), locus));
}
/* Returns the left binding power for the given CompoundAssignmentExpr type.