From: Pierre-Emmanuel Patry <[email protected]>

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]>
---
 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 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;
-- 
2.50.1

Reply via email to