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;

Reply via email to