From: Pierre-Emmanuel Patry Date: Thu, 18 Sep 2025 14:08:30 +0000 (+0200) Subject: gccrs: Prevent segfault on builtin metavars X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=42c46d96a37ac619e60d5ee7949a3248e387b6f6;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/expand/rust-macro-substitute-ctx.cc b/gcc/rust/expand/rust-macro-substitute-ctx.cc index ac36ed8b045..0b78fa535cb 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;