https://gcc.gnu.org/g:42c46d96a37ac619e60d5ee7949a3248e387b6f6
commit r16-4871-g42c46d96a37ac619e60d5ee7949a3248e387b6f6 Author: Pierre-Emmanuel Patry <[email protected]> Date: Thu Sep 18 16:08:30 2025 +0200 gccrs: Prevent segfault on builtin metavars Builtin metavars are not in the fragment, the compiler should not emit an error message. gcc/rust/ChangeLog: * expand/rust-macro-substitute-ctx.cc (is_builtin_metavariable): Add function to check builtin metavars knowledge. (SubstituteCtx::check_repetition_amount): Do not process missing fragment. Signed-off-by: Pierre-Emmanuel Patry <[email protected]> Diff: --- gcc/rust/expand/rust-macro-substitute-ctx.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gcc/rust/expand/rust-macro-substitute-ctx.cc b/gcc/rust/expand/rust-macro-substitute-ctx.cc index ac36ed8b0451..0b78fa535cb7 100644 --- a/gcc/rust/expand/rust-macro-substitute-ctx.cc +++ b/gcc/rust/expand/rust-macro-substitute-ctx.cc @@ -108,6 +108,12 @@ SubstituteCtx::substitute_metavar ( return true; } +static bool +is_builtin_metavariable (AST::Token &token) +{ + return token.get_id () == CRATE; +} + bool SubstituteCtx::check_repetition_amount (size_t pattern_start, size_t pattern_end, @@ -125,6 +131,10 @@ SubstituteCtx::check_repetition_amount (size_t pattern_start, || frag_token->get_id () == IDENTIFIER) { auto it = fragments.find (frag_token->get_str ()); + + if (is_builtin_metavariable (*frag_token)) + continue; + if (it == fragments.end ()) { // If the repetition is not anything we know (ie no declared @@ -136,6 +146,7 @@ SubstituteCtx::check_repetition_amount (size_t pattern_start, frag_token->get_str ().c_str ()); is_valid = false; + continue; } auto &fragment = *it->second;
