From: Kushal Pal Date: Sat, 24 Feb 2024 11:55:48 +0000 (+0530) Subject: gccrs: Reject `default` functions after parsing. X-Git-Tag: basepoints/gcc-17~157 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=b6c3ca175f5e01bf0f43f4cdfe492e8522aa2bbf;p=thirdparty%2Fgcc.git gccrs: Reject `default` functions after parsing. Functions with `default` qualifier outside of `impl` blocks should be allowed to parse successfully and are later rejected during the ASTValidation pass. gcc/rust/ChangeLog: * checks/errors/rust-ast-validation.cc (ASTValidation::visit): Add error for functions with `default` qualifier outside of impl blocks. * parse/rust-parse-impl.hxx (Parser::parse_item): Allow parsing of functions with `default` qualifier. (Parser::parse_vis_item): Likewise. Signed-off-by: Kushal Pal --- diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc index 00a49b6dada..52831e26eb1 100644 --- a/gcc/rust/checks/errors/rust-ast-validation.cc +++ b/gcc/rust/checks/errors/rust-ast-validation.cc @@ -77,6 +77,11 @@ void ASTValidation::visit (AST::Function &function) { const auto &qualifiers = function.get_qualifiers (); + if (qualifiers.is_default () && ctx.peek () != Kind::INHERENT_IMPL + && ctx.peek () != Kind::TRAIT_IMPL) + rust_error_at ( + function.get_locus (), + "% is only allowed on items within % blocks"); if (qualifiers.is_async () && qualifiers.is_const ()) rust_error_at (function.get_locus (), "functions cannot be both % and %"); diff --git a/gcc/rust/parse/rust-parse-impl.hxx b/gcc/rust/parse/rust-parse-impl.hxx index 8c60ac38245..8820e3555e0 100644 --- a/gcc/rust/parse/rust-parse-impl.hxx +++ b/gcc/rust/parse/rust-parse-impl.hxx @@ -431,10 +431,9 @@ Parser::parse_item (bool called_from_statement) else if (t->get_str () == Values::WeakKeywords::DEFAULT && lexer.peek_token (1)->get_id () != EXCLAM) { - add_error (Error (t->get_locus (), - "%qs is only allowed on items within %qs blocks", - "default", "impl")); - return Parse::Error::Item::make_malformed (); + // parse normal functions with `default` qualifier + // they will be rejected in ASTValidation pass + return parse_vis_item (std::move (outer_attrs)); } else if (is_macro_rules_def (t)) { @@ -547,10 +546,13 @@ Parser::parse_vis_item (AST::AttrVec outer_attrs) return parse_union (std::move (vis), std::move (outer_attrs)); // or should item switch go straight to parsing union? } - else + else if (t->get_str () == Values::WeakKeywords::DEFAULT) { - break; + // parse normal functions with `default` qualifier they will be + // rejected in ASTValidation pass + return parse_function (std::move (vis), std::move (outer_attrs)); } + break; case CONST: // lookahead to resolve syntactical production t = lexer.peek_token (1);