aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-06-26 13:06:10 -0400
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 18:46:30 +0100
commit497632d136c6930fab94709e03b48a8a6735de3c (patch)
treeb4ccfa0a3808cf66279450cff6504aecdb5f08ee /gcc
parent3381f522f206f3b64a973976f422b283dd9f49e6 (diff)
downloadgcc-497632d136c6930fab94709e03b48a8a6735de3c.zip
gcc-497632d136c6930fab94709e03b48a8a6735de3c.tar.gz
gcc-497632d136c6930fab94709e03b48a8a6735de3c.tar.bz2
gccrs: Match tokens in macros more closely
gcc/rust/ChangeLog: * expand/rust-macro-expand.cc (MacroExpander::match_token): Match token instead of token id. * parse/rust-parse-impl.h (Parser::skip_token): Add token-skipping variant. (Parser::expect_token): Likewise. * parse/rust-parse.h (Parser::skip_token): Likewise. (Parser::expect_token): Likewise. gcc/testsuite/ChangeLog: * rust/compile/macro-issue2264.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/expand/rust-macro-expand.cc3
-rw-r--r--gcc/rust/parse/rust-parse-impl.h33
-rw-r--r--gcc/rust/parse/rust-parse.h10
-rw-r--r--gcc/testsuite/rust/compile/macro-issue2264.rs12
4 files changed, 56 insertions, 2 deletions
diff --git a/gcc/rust/expand/rust-macro-expand.cc b/gcc/rust/expand/rust-macro-expand.cc
index d14b3b3..27a298e 100644
--- a/gcc/rust/expand/rust-macro-expand.cc
+++ b/gcc/rust/expand/rust-macro-expand.cc
@@ -569,8 +569,7 @@ MacroExpander::match_matcher (Parser<MacroInvocLexer> &parser,
bool
MacroExpander::match_token (Parser<MacroInvocLexer> &parser, AST::Token &token)
{
- // FIXME this needs to actually match the content and the type
- return parser.skip_token (token.get_id ());
+ return parser.skip_token (token.get_tok_ptr ());
}
bool
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index ff929d3..bc87ed7 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -11936,6 +11936,15 @@ Parser<ManagedTokenSource>::skip_token (TokenId token_id)
return expect_token (token_id) != const_TokenPtr ();
}
+/* Checks if current token is similar to inputted token - skips it and returns
+ * true if so, diagnoses an error and returns false otherwise. */
+template <typename ManagedTokenSource>
+bool
+Parser<ManagedTokenSource>::skip_token (const_TokenPtr token)
+{
+ return expect_token (token) != const_TokenPtr ();
+}
+
/* Checks if current token has inputted id - skips it and returns true if so,
* returns false otherwise without diagnosing an error */
template <typename ManagedTokenSource>
@@ -11971,6 +11980,30 @@ Parser<ManagedTokenSource>::expect_token (TokenId token_id)
}
}
+/* Checks the current token - if same as expected, skips and returns it,
+ * otherwise diagnoses error and returns null. */
+template <typename ManagedTokenSource>
+const_TokenPtr
+Parser<ManagedTokenSource>::expect_token (const_TokenPtr token_expect)
+{
+ const_TokenPtr t = lexer.peek_token ();
+ if (t->get_id () == token_expect->get_id ()
+ && (!t->should_have_str () || t->get_str () == token_expect->get_str ()))
+ {
+ lexer.skip_token ();
+ return t;
+ }
+ else
+ {
+ Error error (t->get_locus (), "expecting %qs but %qs found",
+ token_expect->get_token_description (),
+ t->get_token_description ());
+ add_error (std::move (error));
+
+ return const_TokenPtr ();
+ }
+}
+
// Skips all tokens until EOF or }. Don't use.
template <typename ManagedTokenSource>
void
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index 6202574..1d49c95 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -112,6 +112,15 @@ public:
bool skip_token (TokenId t);
/**
+ * Consume a token, reporting an error if it isn't the next token
+ *
+ * @param token pointer to similar token to consume
+ *
+ * @return true if the token was next, false if it wasn't found
+ */
+ bool skip_token (const_TokenPtr token);
+
+ /**
* Same as `skip_token` but allows for failure without necessarily reporting
* an error
*
@@ -172,6 +181,7 @@ private:
void skip_after_end_attribute ();
const_TokenPtr expect_token (TokenId t);
+ const_TokenPtr expect_token (const_TokenPtr token_expect);
void unexpected_token (const_TokenPtr t);
bool skip_generics_right_angle ();
diff --git a/gcc/testsuite/rust/compile/macro-issue2264.rs b/gcc/testsuite/rust/compile/macro-issue2264.rs
new file mode 100644
index 0000000..497dd3c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro-issue2264.rs
@@ -0,0 +1,12 @@
+macro_rules! a {
+ (1) => {x};
+ (2) => {};
+}
+
+macro_rules! b {
+ (a) => {x};
+ (b) => {};
+}
+
+a!(2);
+b!(b);