https://gcc.gnu.org/g:dceaabbe556051101ef1c39b5a323ca7d5bf2f1e

commit dceaabbe556051101ef1c39b5a323ca7d5bf2f1e
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Fri May 9 22:17:55 2025 -0400

    Fix Attr metavariable binding
    
    gcc/rust/ChangeLog:
    
            * parse/rust-parse-impl.h
            (Parser::parse_attr_input): Handle more delimeter tokens and the
            END_OF_FILE token.
            (Parser::skip_after_end_attribute): Handle the END_OF_FILE
            token.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/macros/mbe/meta-param.rs: New test.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/parse/rust-parse-impl.h                    | 5 ++++-
 gcc/testsuite/rust/compile/macros/mbe/meta-param.rs | 7 +++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index e165998e2cb9..bbe75ad88c27 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -877,7 +877,10 @@ Parser<ManagedTokenSource>::parse_attr_input ()
        return attr_input_lit;
       }
       break;
+    case RIGHT_PAREN:
     case RIGHT_SQUARE:
+    case RIGHT_CURLY:
+    case END_OF_FILE:
       // means AttrInput is missing, which is allowed
       return nullptr;
     default:
@@ -11911,7 +11914,7 @@ Parser<ManagedTokenSource>::skip_after_end_attribute ()
 {
   const_TokenPtr t = lexer.peek_token ();
 
-  while (t->get_id () != RIGHT_SQUARE)
+  while (t->get_id () != RIGHT_SQUARE && t->get_id () != END_OF_FILE)
     {
       lexer.skip_token ();
       t = lexer.peek_token ();
diff --git a/gcc/testsuite/rust/compile/macros/mbe/meta-param.rs 
b/gcc/testsuite/rust/compile/macros/mbe/meta-param.rs
new file mode 100644
index 000000000000..ed6e100e5fd0
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macros/mbe/meta-param.rs
@@ -0,0 +1,7 @@
+macro_rules! foo {
+    ($x:meta) => {0}
+}
+
+pub fn main() -> i32 {
+    foo!(Clone)
+}

Reply via email to