https://gcc.gnu.org/g:d0a6d71ec66e90530d3befef7a452a818e20ad3e
commit r16-6829-gd0a6d71ec66e90530d3befef7a452a818e20ad3e Author: Pierre-Emmanuel Patry <[email protected]> Date: Wed Dec 10 13:59:13 2025 +0100 gccrs: Use error collector in the parser Errors in the parser needs to be collected instead of emitted directly. gcc/rust/ChangeLog: * parse/rust-parse-impl.hxx: Collect errors instead of emitting them. Signed-off-by: Pierre-Emmanuel Patry <[email protected]> Diff: --- gcc/rust/parse/rust-parse-impl.hxx | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/gcc/rust/parse/rust-parse-impl.hxx b/gcc/rust/parse/rust-parse-impl.hxx index 9f307717bbcc..20754063fa87 100644 --- a/gcc/rust/parse/rust-parse-impl.hxx +++ b/gcc/rust/parse/rust-parse-impl.hxx @@ -1749,9 +1749,10 @@ Parser<ManagedTokenSource>::parse_generic_param (EndTokenPred is_end_token) auto lifetime = parse_lifetime (false); if (!lifetime) { - rust_error_at ( - token->get_locus (), - "failed to parse lifetime in generic parameter list"); + Error error (token->get_locus (), + "failed to parse lifetime in generic parameter list"); + add_error (std::move (error)); + return nullptr; } @@ -1794,9 +1795,11 @@ Parser<ManagedTokenSource>::parse_generic_param (EndTokenPred is_end_token) type = parse_type (); if (!type) { - rust_error_at ( + Error error ( lexer.peek_token ()->get_locus (), "failed to parse type in type param in generic params"); + add_error (std::move (error)); + return nullptr; } } @@ -1830,11 +1833,13 @@ Parser<ManagedTokenSource>::parse_generic_param (EndTokenPred is_end_token) if (!default_expr) { - rust_error_at (tok->get_locus (), - "invalid token for start of default value for " - "const generic parameter: expected %<block%>, " - "%<identifier%> or %<literal%>, got %qs", - token_id_to_str (tok->get_id ())); + Error error (tok->get_locus (), + "invalid token for start of default value for " + "const generic parameter: expected %<block%>, " + "%<identifier%> or %<literal%>, got %qs", + token_id_to_str (tok->get_id ())); + + add_error (std::move (error)); return nullptr; } @@ -1854,9 +1859,11 @@ Parser<ManagedTokenSource>::parse_generic_param (EndTokenPred is_end_token) } default: // FIXME: Can we clean this last call with a method call? - rust_error_at (token->get_locus (), - "unexpected token when parsing generic parameters: %qs", - token->as_string ().c_str ()); + Error error (token->get_locus (), + "unexpected token when parsing generic parameters: %qs", + token->as_string ().c_str ()); + add_error (std::move (error)); + return nullptr; } @@ -5154,8 +5161,9 @@ Parser<ManagedTokenSource>::parse_self_param () break; if (i == s.size ()) { - rust_error_at (lexer.peek_token ()->get_locus (), - "cannot pass %<self%> by raw pointer"); + Error error (lexer.peek_token ()->get_locus (), + "cannot pass %<self%> by raw pointer"); + add_error (std::move (error)); return Parse::Error::Self::make_self_raw_pointer (); } } @@ -5242,7 +5250,7 @@ Parser<ManagedTokenSource>::parse_self_param () } // ensure that cannot have both type and reference - if (type != nullptr && has_reference) + if (type && has_reference) { Error error ( lexer.peek_token ()->get_locus (),
