From 6c99a5a8f1a62976ff58d89034642f28128a2033 Mon Sep 17 00:00:00 2001 From: Arthur Cohen Date: Fri, 25 Mar 2022 09:50:48 +0100 Subject: 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 --- gcc/rust/ast/rust-expr.h | 5 +++-- gcc/rust/parse/rust-parse-impl.h | 17 +++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'gcc/rust') diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index 7336db2..1966a59 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -704,8 +704,9 @@ public: // Call OperatorExpr constructor to initialise left_expr AssignmentExpr (std::unique_ptr value_to_assign_to, - std::unique_ptr value_to_assign, Location locus) - : OperatorExpr (std::move (value_to_assign_to), std::vector (), + std::unique_ptr value_to_assign, + std::vector outer_attribs, Location locus) + : OperatorExpr (std::move (value_to_assign_to), std::move (outer_attribs), locus), right_expr (std::move (value_to_assign)) {} 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::parse_stmt_or_expr_without_block () { // should be expr without block std::unique_ptr 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::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 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::parse_stmt_or_expr_without_block () * expression then make it statement if semi afterwards */ std::unique_ptr 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::parse_expr (int right_binding_power, // parse null denotation (unary part of expression) std::unique_ptr expr - = null_denotation (current_token, std::move (outer_attrs), restrictions); + = null_denotation (current_token, {}, restrictions); if (expr == nullptr) { @@ -12452,8 +12452,8 @@ Parser::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 std::unique_ptr Parser::parse_assig_expr ( const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr 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 right @@ -13799,7 +13799,8 @@ Parser::parse_assig_expr ( Location locus = left->get_locus (); return std::unique_ptr ( - 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. -- cgit v1.1