aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/parse
AgeCommit message (Collapse)AuthorFilesLines
2024-01-16gccrs: Parse semicolons in more cases for statement macrosMatthew Jasper2-589/+308
gccrs: Parse statement macros as statements. gcc/rust/ChangeLog: * ast/rust-ast.h (MacroInvocation::add_semicolon): New method. (Expr::to_stmt): Remove method. * ast/rust-macro.h (MacroInvocation::add_semicolon): Add override. (MacroInvocation::to_stmt): Remove override. * ast/rust-stmt.h: Remove use of Expr::to_stmt. (ExprStmt::add_semicolon): Add override. * expand/rust-macro-expand.h (struct MacroExpander): Add EXPR/STMT and remove BLOCK from ContextType. * expand/rust-expand-visitor.cc (ExpandVisitor::maybe_expand_expr): Use EXPR context. (ExpandVisitor::expand_inner_stmts): Use STMT context. (ExpandVisitor::visitor): Remove use of BLOCK context. * expand/rust-macro-expand.cc (parse_many): Pass enum by value. (transcribe_on_delimiter): Remove function. (transcribe_context): Use EXPR/STMT contexts. (MacroExpander::parse_proc_macro_output): Use EXPR/STMT contexts. (transcribe_many_stmts): Parse statements with semicolons. * parse/rust-parse-impl.h (Parser::parse_stmt): Delegate macro parsing to parse_expr_stmt, check for ! after macro_rules. (Parser::parse_let_stmt): Work around lack of NT tokens. (Parser::parse_expr_stmt): Handle statements at end of macro expansions. (Parser::parse_expr_stmt): Parse macro statements/expression statements starting with a macro. (Parser::parse_match_expr): Don't modify flag unnecessarily. (Parser::parse_stmt_or_expr): Parse macro statements/expression statements starting with a macro. (Parser::parse_path_based_stmt_or_expr): Remove method. (Parser::parse_macro_invocation_maybe_semi): Remove method. (Parser::parse_expr): Move code into left_denotations. (Parser::left_denotations): New method. (Parser::null_denotation): Split out methods for cases with and without paths. (Parser::null_denotation_path): New method. (Parser::null_denotation_not_path): New method. (Parser::parse_macro_invocation_partial): Don't check for semicolon here. * parse/rust-parse.h: Update declarations. (struct ParseRestrictions): Additional flag. gcc/testsuite/ChangeLog: * rust/compile/braced_macro_arm.rs: New test. * rust/compile/braced_macro_statements1.rs: New test. * rust/compile/braced_macro_statements2.rs: New test. * rust/compile/braced_macro_statements3.rs: New test. * rust/compile/issue-2225.rs: Update test. * rust/compile/macro53.rs: New test. Signed-off-by: Matthew Jasper <mjjasper1@gmail.com>
2024-01-16gccrs: Fix non-mod-rs files' external module loading pathsOwen Avery1-1/+19
gcc/rust/ChangeLog: * Make-lang.in: Add "rust-dir-owner.o". * ast/rust-ast.cc: Include "rust-dir-owner.h". (Module::process_file_path): Handle non-mod-rs external file modules properly. * parse/rust-parse-impl.h: Include "rust-dir-owner.h". (Parser::parse_module): Handle non-mod-rs external file modules properly. * util/rust-dir-owner.cc: New file. * util/rust-dir-owner.h: New file. gcc/testsuite/ChangeLog: * rust/compile/test_mod.rs: Moved to... * rust/compile/issue-1089/test_mod.rs: ...here. * rust/compile/mod_missing_middle.rs: Fix paths. * rust/compile/missing_middle/both_path.rs: Moved to... * rust/compile/mod_missing_middle/missing_middle/both_path.rs: ...here. * rust/compile/missing_middle/explicit.not.rs: Moved to... * rust/compile/mod_missing_middle/missing_middle/explicit.not.rs: ...here. * rust/compile/missing_middle/other.rs: Moved to... * rust/compile/mod_missing_middle/missing_middle/explicit.not/other.rs: ...here. * rust/compile/missing_middle/inner_path.rs: Moved to... * rust/compile/mod_missing_middle/missing_middle/inner_path.rs: ...here. * rust/compile/missing_middle/outer_path.rs: Moved to... * rust/compile/mod_missing_middle/missing_middle/outer_path.rs: ...here. * rust/compile/missing_middle/sub/mod.rs: Moved to... * rust/compile/mod_missing_middle/missing_middle/sub/mod.rs: ...here. * rust/compile/torture/modules/mod.rs: Moved to... * rust/compile/torture/extern_mod1/modules/mod.rs: ...here. * rust/execute/torture/modules/mod.rs: Moved to... * rust/execute/torture/extern_mod4/modules/mod.rs: ...here. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Allow parsing a borrow from struct expressionOwen Avery1-3/+2
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::null_denotation): Allow struct expression referencing. gcc/testsuite/ChangeLog: * rust/compile/struct-expr-parse.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Properly match delimitersOwen Avery2-0/+13
gcc/rust/ChangeLog: * expand/rust-macro-expand.cc (MacroExpander::try_match_rule): Don't match delimiters for root matcher. (MacroExpander::match_matcher): Add option to match delimiters. * expand/rust-macro-expand.h (MacroExpander::match_matcher): Likewise. * parse/rust-parse-impl.h (Parser::skip_token): Add zero argument method. * parse/rust-parse.h: (Parser::skip_token): Likewise. gcc/testsuite/ChangeLog: * rust/compile/macro-delim.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Parse AttrInputMacroOwen Avery1-0/+15
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_attr_input): Parse AttrInputMacro. gcc/testsuite/ChangeLog: * rust/compile/doc_macro.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Handle keyword metavariablesOwen Avery1-3/+3
gcc/rust/ChangeLog: * expand/rust-macro-substitute-ctx.cc (SubstituteCtx::check_repetition_amount): Handle keywords. (SubstituteCtx::substitute_token): Likewise. * lex/rust-token.cc (Token::get_str): Likewise. * parse/rust-parse-impl.h (Parser::parse_macro_match_fragment): Likewise. gcc/testsuite/ChangeLog: * rust/compile/macro-issue2194.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Fix parsing of block expressions followed by `.`Matthew Jasper2-483/+115
`{ ... }.f;` is parsed as a single statement in rust. This means that we can't determine whether an expression statement will need a semicolon terminator until we finish parsing it. To handle this we change expression parsing to check for this case by inspecting the expression returned from null_denotation and looking ahead for a `.` or `?` token. gcc/rust/ChangeLog: * ast/rust-ast.h (Expr::as_expr_without_block): Remove. (Expr::set_outer_attrs): Make public in base class. * expand/rust-macro-expand.cc: Add fixme comment for pre-existing bug. * hir/tree/rust-hir.h: Remove Expr::as_expr_without_block. * parse/rust-parse-impl.h (Parser::parse_lifetime): Use lifetime_from_token. (Parser::lifetime_from_token): New method. (Parser::null_denotation): Handle labelled loop expressions and for loop expressions. (Parser::parse_loop_label): Make initial token a parameter. (Parser::parse_labelled_loop_expr): Likewise. (Parser::parse_for_loop_expr): Allow FOR token to already be skipped. (Parser::parse_expr): Handle expr_can_be_stmt. (Parser::parse_expr_with_block): Remove. (Parser::parse_expr_stmt_with_block): Remove. (Parser::parse_expr_stmt_without_block): Remove. (Parser::parse_expr_without_block): Remove. (Parser::parse_stmt_or_expr_with_block): Remove. (Parser::parse_expr_stmt): Use parse_expr directly. (Parser::parse_match_expr): Likewise. (Parser::parse_stmt): Use parse_expr_stmt in more cases. (Parser::parse_stmt_or_expr): Rename from parse_stmt_or_expr_without_block, use parse_expr directly. (Parser::parse_block_expr): Update error message. * parse/rust-parse.h: Update declarations. gcc/testsuite/ChangeLog: * rust/compile/for_expr.rs: New test. * rust/compile/issue-407-2.rs: Update compiler output. * rust/compile/issue-407.rs: Update compiler output. * rust/compile/issue-867.rs: Update compiler output. * rust/compile/issue-2189.rs: New test. * rust/compile/macro_call_statement.rs: New test. * rust/compile/stmt_with_block_dot.rs: New test. * rust/compile/torture/loop8.rs: New test. Signed-off-by: Matthew Jasper <mjjasper1@gmail.com>
2024-01-16gccrs: ast: Remove ExprStmtWithBlock / ExprStmtWithoutBlock distinctionMatthew Jasper2-57/+34
This distinction isn't very helpful and makes correct parsing harder. gcc/rust/ChangeLog: * ast/rust-ast-full-decls.h (class ExprStmtWithoutBlock): Remove. (class ExprStmtWithBlock): Remove. * ast/rust-stmt.h (class ExprStmtWithoutBlock): Remove. (class ExprStmtWithBlock): Remove. (class ExprStmt): Make non-abstract, add common functionality from removed base classes. * ast/rust-ast.h: Move to_stmt to base class. * ast/rust-ast.cc (ExprStmtWithBlock::as_string): Remove. * ast/rust-macro.h: Use new signature for to_stmt. (ExprStmt::as_string): New method. (ExprStmtWithoutBlock::as_string): Remove. (BlockExpr::strip_tail_expr): Update for removed classes. (ExprStmtWithoutBlock::accept_vis): Remove. (ExprStmtWithBlock::accept_vis): Remove. (ExprStmt::accept_vis): New method. * ast/rust-ast-dump.cc (Dump::visit): Update for removed classes. * ast/rust-ast-dump.h: Likewise. * ast/rust-ast-collector.h: Likewise. * ast/rust-ast-collector.cc (TokenStream::visit): Likewise. * ast/rust-ast-visitor.h: Likewise. * checks/errors/rust-feature-gate.h: Likewise. * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Likewise. * expand/rust-expand-visitor.h: Likewise. * expand/rust-cfg-strip.cc (CfgStrip::visit): Likewise. * expand/rust-cfg-strip.h: Likewise. * hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Likewise. * hir/rust-ast-lower-base.h: Likewise. * hir/rust-ast-lower-stmt.cc (ASTLoweringStmt::visit): Likewise. * hir/rust-ast-lower-stmt.h: Likewise. * util/rust-attributes.cc (AttributeChecker::visit): Likewise. * util/rust-attributes.h: Likewise. * resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Likewise. * resolve/rust-ast-resolve-base.h: Likewise. * resolve/rust-ast-resolve-stmt.h: Likewise. * resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit): Likewise. * resolve/rust-early-name-resolver.h: Likewise. * parse/rust-parse-impl.h (Parser::parse_match_expr): Likewise. (Parser::parse_stmt_or_expr_without_block): Likewise. * parse/rust-parse.h: Likewise. Signed-off-by: Matthew Jasper <mjjasper1@gmail.com>
2024-01-16gccrs: Handle keywords in macro fragmentsOwen Avery2-0/+19
gcc/rust/ChangeLog: * lex/rust-token.cc (token_id_is_keyword): New. (token_id_keyword_string): New. * lex/rust-token.h (token_id_is_keyword): New. (token_id_keyword_string): New. * expand/rust-macro-expand.cc (MacroExpander::match_fragment): Match keywords for ident fragment. * parse/rust-parse-impl.h (Parser::parse_identifier_or_keyword_token): Add. * parse/rust-parse.h (Parser::parse_identifier_or_keyword_token): Add. gcc/testsuite/ChangeLog: * rust/compile/macro-issue2192.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Fix "default unsafe fn ..." parsingOwen Avery1-3/+3
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_trait_impl_function_or_method): Parse function/method qualifiers after "default". gcc/testsuite/ChangeLog: * rust/compile/parse_specialization.rs: Add "default unsafe" coverage. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Fix infinite loop with parsing invalid generic parametersOwen Avery1-0/+2
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_generic_params): Handle parameter parsing error. gcc/testsuite/ChangeLog: * rust/compile/issue-2125.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Deleted the as_string ASR and HIR dumpsM V V S Manoj Kumar1-9/+0
Fixes #2021, #2022 Deleted Parser::debug_dump_ast_output, removed any functions that called it i.e Session::dump_ast and Session::dump_ast_expanded, and any associated items. Made it so that when you use the dump option "expanded" it dumps the pretty ast only. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::debug_dump_ast_output): Removed this funtion. * rust-session-manager.cc (Session::enable_dump): Removed else if (arg == "parse"). (Session::compile_crate): Removed calls of dump_ast and dump_ast_expanded. (Session::dump_ast): Removed this function. (Session::dump_ast_expanded): Removed this function. * rust-session-manager.h (struct CompileOptions): Removed the PARSER_AST_DUMP option. Signed-off-by: M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
2024-01-16gccrs: parser: Parse reference patterns correctlyArthur Cohen1-1/+1
Reference patterns cannot contain AltPatterns per the Rust reference, so we should not call into `parse_pattern` to parse the referenced pattern, but rather the more restrictive `parse_pattern_no_alt`. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_reference_pattern): Do not call into `parse_pattern` anymore. gcc/testsuite/ChangeLog: * rust/compile/issue-1807.rs: New test.
2024-01-16gccrs: parser: Fix attribute differentationPierre-Emmanuel Patry1-1/+1
In some cases, while parsing an outer attribute, the parser would return an inner attribute. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_outer_attribute): Fix attribute status. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: parser: macro: reject separator in `?` repetitionSebastian Kirmayer1-0/+10
A matcher like $(a),? is no longer accepted. Fixes #2092. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser<ManagedTokenSource>::parse_macro_match_repetition): reject separator in `?` repetition gcc/testsuite/ChangeLog: * rust/compile/macro-issue2092.rs: New test. Signed-off-by: Sebastian Kirmayer <gnu@kirmayer.eu>
2024-01-16gccrs: Unify AST::IfLetExprConseqIf{,Let} into AST::IfLetExprConseqElseOwen Avery1-8/+7
This simplifies the AST's representation of if-let-statements to match the HIR. gcc/rust/ChangeLog: * ast/rust-expr.h (class IfLetExprConseqElse): Make else_block ExprWithBlock. (class IfLetExprConseqIf): Remove. (class IfLetExprConseqIfLet): Remove. * ast/rust-ast-full-decls.h (class IfLetExprConseqIf): Remove. (class IfLetExprConseqIfLet): Remove. * ast/rust-ast.cc (IfLetExprConseqElse::as_string): Adjust output. (IfLetExprConseqIf::as_string): Remove. (IfLetExprConseqIfLet::as_string): Remove. (IfLetExprConseqIf::accept_vis): Remove. (IfLetExprConseqIfLet::accept_vis): Remove. * ast/rust-ast-visitor.h (ASTVisitor::visit): Remove IfLetExprConseqIf{,Let} visitors. * ast/rust-ast-dump.cc (Dump::visit): Likewise. * ast/rust-ast-dump.h: (Dump::visit): Likewise. * ast/rust-ast-tokenstream.cc (TokenStream::visit): Likewise. * ast/rust-ast-tokenstream.h (TokenStream::visit): Likewise. * util/rust-attributes.cc (AttributeChecker::visit): Likewise. * util/rust-attributes.h: (AttributeChecker::visit): Likewise. * resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit): Likewise. * resolve/rust-early-name-resolver.h (EarlyNameResolver::visit): Likewise. * resolve/rust-ast-resolve-base.h (ResolverBase::visit): Likewise. * resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Likewise. * checks/errors/rust-feature-gate.h (FeatureGate::visit): Likewise. * expand/rust-cfg-strip.cc (CfgStrip::visit): Likewise. * expand/rust-cfg-strip.h: (CfgStrip::visit): Likewise. * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Likewise. * expand/rust-expand-visitor.h (ExpandVisitor::visit): Likewise. * hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Likewise. * hir/rust-ast-lower-base.h: (ASTLoweringBase::visit): Likewise. * parse/rust-parse-impl.h (Parser::parse_if_let_expr): Replace IfLetExprConseqIf{,Let} with IfLetExprConseqElse. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Handle underscore in MacroMatch.Owen Avery1-0/+1
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_macro_match): Handle underscore. gcc/testsuite/ChangeLog: * rust/compile/macro51.rs: New test.
2024-01-16gccrs: Unify AST::IfExprConseqIf{,Let} into AST::IfExprConseqElseOwen Avery1-10/+10
This simplifies the AST's representation of if-statements to match the HIR. gcc/rust/ChangeLog: * ast/rust-expr.h (class IfExprConseqElse): Make else_block ExprWithBlock. (class IfExprConseqIf): Remove. (class IfExprConseqIfLet): Remove. * ast/rust-ast-full-decls.h (class IfExprConseqIf): Remove. (class IfExprConseqIfLet): Remove. * ast/rust-ast.cc (IfExprConseqElse::as_string): Adjust output. (IfExprConseqIf::as_string): Remove. (IfExprConseqIfLet::as_string): Remove. (IfExprConseqIf::accept_vis): Remove. (IfExprConseqIfLet::accept_vis): Remove. * ast/rust-ast-visitor.h (ASTVisitor::visit): Remove IfExprConseqIf{,Let} visitors. * ast/rust-ast-tokenstream.cc (TokenStream::visit): Likewise. * ast/rust-ast-tokenstream.h (TokenStream::visit): Likewise. * ast/rust-ast-dump.cc (Dump::visit): Likewise. * ast/rust-ast-dump.h (Dump::visit): Likewise. * checks/errors/rust-feature-gate.h (FeatureGate::visit): Likewise. * util/rust-attributes.cc (AttributeChecker::visit): Likewise. * util/rust-attributes.h (AttributeChecker::visit): Likewise. * resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit): Likewise. * resolve/rust-early-name-resolver.h (EarlyNameResolver::visit): Likewise. * resolve/rust-ast-resolve-base.h (ResolverBase::visit): Likewise. * resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Likewise. * resolve/rust-ast-resolve-expr.h (ResolveExpr::visit): Remove IfExprConseqIf visitor. * resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): Likewise. * expand/rust-cfg-strip.cc (CfgStrip::visit): Remove IfExprConseqIf{,Let} visitors. * expand/rust-cfg-strip.h (CfgStrip::visit): Likewise. * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Likewise. * expand/rust-expand-visitor.h (ExpandVisitor::visit): Likewise. * hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Likewise. * hir/rust-ast-lower-base.h (ASTLoweringBase::visit): Likewise. * hir/rust-ast-lower-block.h (ASTLoweringIfBlock::visit): Remove IfExprConseqIf visitor. (ASTLoweringExprWithBlock::visit): Likewise. * hir/rust-ast-lower.cc (ASTLoweringIfBlock::visit): Remove IfExprConseqIf visitor, adjust IfExprConseqElse lowering. * hir/rust-ast-lower-expr.h (ASTLoweringExpr::visit): Remove IfExprConseqIf visitor. * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise. * parse/rust-parse-impl.h (Parser::parse_if_expr): Replace IfExprConseqIf{,Let} with IfExprConseqElse. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: ast: Add difference between attributesPierre-Emmanuel Patry2-11/+36
Add a boolean to tell inner and outer attributes ast nodes appart. This meant refactoring a bit their parsing function. gcc/rust/ChangeLog: * ast/rust-ast.h: Add boolean for differenciation. * parse/rust-parse-impl.h (Parser::parse_doc_comment): Change function interface to make code cleaner. It should return a body instead of the whole attribute. (Parser::parse_inner_attribute): Specify the inner status of the node. (Parser::parse_attribute_body): Change function interface to make the code cleaner much like parse_doc_comment. (Parser::parse_outer_attribute): Specify outer status of the node. * parse/rust-parse.h: Update functions prototypes. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: Fix parsing of array expressions.Owen Avery1-3/+0
Array expressions were being eagerly handled outside of Pratt parsing. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser<ManagedTokenSource>::parse_expr_without_block): Remove direct array expression handling. gcc/testsuite/ChangeLog: * rust/compile/array4.rs: New test. * rust/execute/torture/arrays.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16gccrs: Add all rust keywords (except priv) to the follow-set of `:vis` when ↵Tage Johansson1-28/+64
parsing macro rules Previously, the following macro rules were rejected by gccrs: ```Rust macro_rules! { ($v:vis <KEY_WORD>) => { ... }; } ``` This PR fixes so the above code is accepted by the compiler for all key words like `async` or `unsafe`. The only exception is the keyword `priv` which is not allowed. See [this page](https://doc.rust-lang.org/reference/macro-ambiguity.html) for reference. Especially the following excerpt: > FOLLOW(vis) = {,l any keyword or identifier except a non-raw priv; any token that can begin a type; ident, ty, and path nonterminals}. Fixes #1060 gcc/rust/ChangeLog: * parse/rust-parse.cc: fix follow-sets gcc/testsuite/ChangeLog: * rust/compile/macro47.rs: Test that :vis can be followed by some keywords * rust/compile/macro48.rs: Test that :vis cannot be followed by the keyword priv Signed-off-by: Tage Johansson <frans.tage@gmail.com>
2024-01-16gccrs: parser: Fix handling of multiple left angles in null denotationgoar56701-0/+7
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_expr): split LEFT_SHIFT before null_denotation. gcc/testsuite/ChangeLog: * rust/compile/complex_qualified_path_in_expr.rs : New test. Signed-off-by: Mahmoud Mohamed <mahadelr19@gmail.com>
2024-01-16gccrs: parser: Fix parsing closure parametergoar56701-1/+1
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_closure_param): Replace parse_pattern with parse_pattern_no_alt. gcc/testsuite/ChangeLog: * rust/compile/closure_no_type_anno.rs: New test. Signed-off-by: Mahmoud Mohamed <mahadelr19@gmail.com>
2024-01-16gccrs: parser: Fix while let expr parsingPierre-Emmanuel Patry1-4/+11
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 <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: parser: Add 0 sized slice pattern parsingPierre-Emmanuel Patry1-1/+8
Check for a closing square bracket before attempting to parse any pattern within a slice. Also add a new test to verify zero sized slice parsing. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_slice_pattern): Add closing square bracket check. gcc/testsuite/ChangeLog: * rust/compile/zero_sized_slice.rs: New test. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: fixup: parser: Fix bootstrap compile errorPierre-Emmanuel Patry1-3/+2
The recent changes in the parser bringing the parsing of extern type items also brought a compilation error when boostrapping the compiler. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_external_type_item): Fix compilation error due to unnecessary move. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: parser: Add RestPattern parsingPierre-Emmanuel Patry1-0/+4
Add simple RestPattern parsing to the pattern parsing function. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_pattern_no_alt): Handle RestPattern correctly. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: parser: Fix if let parsingPierre-Emmanuel Patry1-1/+1
Fix if let parsing in null_notation function. This problem was due to the current token already being passed in the function parameters and already out of the buffered queue. Hence why the peeked token was let and not if. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::null_denotation): Fix if let parsing. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: parser: Parse external type itemPierre-Emmanuel Patry2-0/+33
Add the code to parse type item declaration within an extern block. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_external_type_item): Add function to parser an external type item. (Parser::parse_external_item): Add identification and parsing for external type items. * parse/rust-parse.h: Add parser_external_type_item prototype. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16gccrs: parser: Parse `default` impl Functions and MethodsArthur Cohen1-80/+47
gcc/rust/ChangeLog: * ast/rust-item.h (class Method): Add `is_default` field. (class Function): Likewise. * parse/rust-parse-impl.h (Parser::parse_item): Add nice error when parsing `default` outside of an `impl` block (Parser::parse_trait_impl_item): Allow parsing functions or methods when seeing `default`. gcc/testsuite/ChangeLog: * rust/compile/parse_invalid_specialization.rs: New test. * rust/compile/parse_specialization.rs: New test. * rust/compile/default_not_a_kw.rs: New test.
2024-01-16gccrs: parser: Add parsing of auto traitsArthur Cohen1-4/+32
This adds enough handling to start parsing `auto` traits but not handle them in the AST, lowering phase or HIR yet. The feature is named `optin_builtin_traits` in Rust 1.49 but changes to `auto_traits` later down the line. So we'll need to take care of this later on. Finally, this also changes the way the lexer detects if a string is a keyword or not. We relied on a call to `std::lower_bound` to figure out if a string was contained in an array or not, and this ended up causing issues when adding new keywords. We can instead switch to a simple hashmap and search for the key. The code *might* be less optimized (unsure) but it is definitely simpler and easier to read. Fixes #1814 gcc/rust/ChangeLog: * ast/rust-item.h (class Trait): Add `has_auto` field. * checks/errors/rust-feature.cc: Add handling for `feature(optin_builtin_traits)` * checks/errors/rust-feature.h: Likewise. * lex/rust-lex.cc: Fix keyword classification using hashmap. * lex/rust-token.h: Add `auto` keyword token. * parse/rust-parse-impl.h (Parser::parse_vis_item): Parse auto traits on `auto` keyword. gcc/testsuite/ChangeLog: * rust/compile/auto_trait_invalid.rs: New test. * rust/compile/auto_trait_valid.rs: New test.
2024-01-16gccrs: parser: Allow `LEFT_SHIFT` to start `parse_type`Arthur Cohen1-4/+11
Similarly to the last commit, we need to allow `LEFT_SHIFT` tokens to start a qualified path type and split them into two `LEFT_ANGLE` tokens. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_type): Allow LEFT_SHIFT to start a type and then split it in `parse_qualified_path_type` gcc/testsuite/ChangeLog: * rust/compile/parse_associated_type_as_generic_arg3.rs: New test.
2024-01-16gccrs: parser: Allow parsing of qualified type path as nested generic argumentArthur Cohen1-0/+4
Let's take the example of lexing `Option<<T as Iterator>::Item>` and look at the first few tokens. Originally, `Option<<T` was lexed as 3 tokens: * IDENTIFIER(Option) * LEFT_SHIFT * IDENTIFIER(T) The parser did not allow a list of generic arguments to start with a left shift, and rejected the above type. We are now splitting the left shift into two left angles, as this allows complex generic arguments and overall makes sense parsing wise. Thus, the above list becomes: * IDENTIFIER(Option) * LEFT_ANGLE * LEFT_ANGLE * IDENTIFIER(T) and `<T as Iterator>` is properly parsed as a qualified path. Fixes #1815 Fixed #1809 Addresses #1524 gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_path_generic_args): Split leading `LEFT_SHIFT` token into two `LEFT_ANGLE` tokens when parsing generic arguments. (Parser::parse_type_path_segment): Allow `LEFT_ANGLE` as starting token for parsing generic arguments. gcc/testsuite/ChangeLog: * rust/compile/parse_associated_type_as_generic_arg.rs: New test. * rust/compile/parse_associated_type_as_generic_arg2.rs: New test. * rust/compile/path_as_generic_arg.rs: New test. * rust/compile/nested_generic.rs: New test.
2024-01-16gccrs: Parse AltPatternOwen Avery2-1/+33
Renamed Parser::parse_pattern to Parser::parse_pattern_no_alt and created new method Parser::parse_pattern to handle alternate patterns. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_pattern): Add. (Parser::parse_pattern_no_alt): Rename. * parse/rust-parse.h: (Parser::parse_pattern): Add. (Parser::parse_pattern_no_alt): Rename. gcc/testsuite/ChangeLog: * rust/compile/pattern-or.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-03Update copyright years.Jakub Jelinek1-1/+1
2023-04-06gccrs: Fix issue with parsing unsafe block expression statementsOwen Avery1-1/+9
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_stmt): Handle unsafe expression statements. gcc/testsuite/ChangeLog: * rust/compile/issue-1422.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2023-04-06gccrs: Address unsafe with/without block handling ambiguityOwen Avery1-12/+3
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_expr_stmt): Remove hypothetical unsafe + expr_stmt_without_block handling. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2023-04-06gccrs: diagnostic: Refactor Error classArthur Cohen1-1/+1
The class now allows for more variants including a `Hint` one which then gets emitted by calling `rust_inform`. This allows us to display hints/tips/notes in backtracking contexts such as the parser. gcc/rust/ChangeLog: * rust-diagnostics.h (struct Error): Add new Kind enum and various new static constructors to allow for hints as well. * rust-diagnostics.cc (Error::Error): Use new `kind` field properly. * checks/errors/privacy/rust-visibility-resolver.cc (VisibilityResolver::resolve_module_path): Use new Error API. * expand/rust-macro-builtins.cc (MacroBuiltin::include_handler): Likewise. * expand/rust-macro-expand.cc (parse_many): Likewise. (transcribe_type): Likewise. * parse/rust-parse-impl.h (Parser::parse_crate): Likewise. * rust-session-manager.cc (Session::handle_crate_name): Likewise. * ast/rust-ast.cc (Module::load_items): Likewise.
2023-04-06gccrs: Add support for parsing empty tuple patterns.Owen Avery1-0/+9
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_grouped_or_tuple_pattern): Add support for empty tuple patterns. gcc/testsuite/ChangeLog: * rust/compile/parse_empty_tuple_pattern.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2023-04-06gccrs: parser: Expose parse_macro_invocation as public APIArthur Cohen1-2/+2
gcc/rust/ChangeLog: * parse/rust-parse.h: Move `parse_macro_invocation` to public API.
2023-04-06gccrs: parser: Fix parsing of closure param listArthur Cohen1-0/+2
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_closure_expr): Advance tokens properly when parsing closure param list. gcc/testsuite/ChangeLog: * rust/compile/closure_move_expr.rs: New test.
2023-04-06gccrs: parser: Improve parsing of complex generic argumentsArthur Cohen1-1/+3
The parser was missing code for handling complex type arguments such as type paths or nested generics. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_generic_arg): Handle type paths and nested generics properly. gcc/testsuite/ChangeLog: * rust/compile/parse_complex_generic_application.rs: New test. * rust/compile/parse_complex_generic_application2.rs: New test.
2023-04-06gccrs: parser: Allow parsing multiple reference typesArthur Cohen2-6/+29
The parser now recursively tries to parse a reference type after seeing a `&` or `&&` token. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_type): Handle double ampersan properly (Parser::parse_reference_type): Call into `parse_reference_type_inner` and wrap double reference types in another `AST::ReferenceType` node (Parser::parse_reference_type_inner): Add parsing implementation which does not care about the leading token (& or &&) (Parser::parse_type_no_bounds): Handle double ampersand properly * parse/rust-parse.h: Declare `parse_reference_type_inner` gcc/testsuite/ChangeLog: * rust/compile/multi_reference_type.rs: New test.
2023-04-06gccrs: macro: Allow builtin `MacroInvocation`s within the ASTArthur Cohen1-38/+32
gcc/rust/ChangeLog: * ast/rust-macro.h (enum class): Add `BuiltinMacro` enum class. * expand/rust-attribute-visitor.cc (AttrVisitor::visit): Mention switching on `macro.kind` once builtin macro invocations are properly handled. * parse/rust-parse-impl.h (Parser::parse_macro_invocation): Switch to new MacroInvocation API. (Parser::parse_type): Likewise. (Parser::parse_type_no_bounds): Likewise.
2023-04-06gccrs: fixed compiler error message on wildcard pattern within expressionAbdul Rafey1-0/+6
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::null_denotation): Add proper error when seeing wildcard var on right side of assignment. gcc/testsuite/ChangeLog: * rust/compile/issue-867.rs: New test. Signed-off-by: Abdul Rafey <abdulrafeyq@gmail.com>
2023-04-06gccrs: Implement declarative macro 2.0 parserRaiki Tamura2-55/+177
gcc/rust/ChangeLog: * ast/rust-ast-full-decls.h (class MacroItem): Remove forward declaration. * ast/rust-ast-full-test.cc (MacroRulesDefinition): Rework MacroRulesDefinition class * ast/rust-ast.h (class MacroItem): Remove abstract class. * ast/rust-item.h (class MacroItem): Remove forward declaration. * ast/rust-macro.h (class MacroItem): Likewise. (class MacroRulesDefinition): Add MacroKind enum. (class MacroInvocation): Fix inheritance. * lex/rust-token.h: Token "macro" is now used. * parse/rust-parse-impl.h (Parser::parse_item): Add handling for MACRO. (Parser::parse_vis_item): Call into parse_decl_macro_def. (Parser::parse_macro_item): Delete function. (Parser::parse_macro_rules_def): Return MBE macros only. (Parser::parse_decl_macro_def): New function. (Parser::parse_stmt): Handle MACRO token. (Parser::parse_stmt_or_expr_without_block): Call into parse_macro_rules_def. * parse/rust-parse.h: Declare new function. gcc/testsuite/ChangeLog: * rust/compile/decl_macro1.rs: New test. * rust/compile/decl_macro2.rs: New test. * rust/compile/decl_macro3.rs: New test. * rust/compile/decl_macro4.rs: New test. * rust/compile/decl_macro5.rs: New test. * rust/compile/decl_macro6.rs: New test. * rust/compile/decl_macro7.rs: New test. * rust/execute/torture/decl_macro1.rs: New test. * rust/execute/torture/decl_macro2.rs: New test. * rust/execute/torture/decl_macro3.rs: New test. * rust/execute/torture/decl_macro4.rs: New test. Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
2023-04-06gccrs: rust: add bound parsing in parse_generic_arg.mxlol2331-0/+17
gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_generic_arg): Add proper bound parsing. gcc/testsuite/ChangeLog: * rust/compile/bounds.rs: New test. Signed-off-by: Xiao Ma <mxlol233@outlook.com>
2023-02-21gccrs: Improve lexer dumpRaiki Tamura2-43/+0
gcc/rust/ChangeLog: * lex/rust-lex.cc (Lexer::Lexer): Add `dump_lex` boolean flag. (Lexer::skip_token): Dump tokens if flag is enabled. (Lexer::dump_and_skip): New function. * lex/rust-lex.h: Include optional.h and declare functions. * parse/rust-parse-impl.h (Parser::debug_dump_lex_output): Remove old unused function. * parse/rust-parse.h: Likewise. * rust-session-manager.cc (Session::compile_crate): Pass lexer dump option to lexer. (Session::dump_lex): New function. * util/rust-optional.h: Add missing constructor. Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
2023-02-21gccrs: Remove default location. Add visibility location to create_* functionsDave1-5/+6
gcc/rust/ChangeLog: * ast/rust-item.h: Remoe default location for Visibility class. * parse/rust-parse-impl.h (Parser::parse_visibility): Pass proper location when instantiating visibilities.
2023-02-21gccrs: fix ICE on missing closing parenMarc Poulhiès1-4/+11
Fix crash (segfault) on a missing closing parenthesis when parsing the expressions in a block. The returned `expr` was missing a check before being used. Add corresponding test. Signed-off-by: Marc Poulhiès <dkm@kataplop.net> gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_stmt_or_expr_without_block): Check if `expr` is valid after parsing it. gcc/testsuite/ChangeLog: * rust/compile/missing_closing_paren.rs: New test.