]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Prevent segfault on builtin metavars
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Thu, 18 Sep 2025 14:08:30 +0000 (16:08 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Thu, 30 Oct 2025 20:30:52 +0000 (21:30 +0100)
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 <pierre-emmanuel.patry@embecosm.com>
gcc/rust/expand/rust-macro-substitute-ctx.cc

index ac36ed8b0451b7844b535850673fa58af3600c16..0b78fa535cb7f89dfa5c9138db873b4d4c138a46 100644 (file)
@@ -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;