aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-05-30 16:24:08 -0400
committerPhilip Herron <philip.herron@embecosm.com>2023-06-01 15:21:53 +0000
commitd0e9f47b084611a6a8c3a407770160874e1c431a (patch)
treebc8b71a11216aa07a224eabe36b6e7f37bb0ad29
parent18c00a4c0c12e721755adf4a4869b6fa7ef1784d (diff)
downloadgcc-d0e9f47b084611a6a8c3a407770160874e1c431a.zip
gcc-d0e9f47b084611a6a8c3a407770160874e1c431a.tar.gz
gcc-d0e9f47b084611a6a8c3a407770160874e1c431a.tar.bz2
Properly match delimiters
gcc/rust/ChangeLog: * expand/rust-macro-expand.cc (MacroExpander::try_match_rule): Don't match delimiters for root matcher. (MacroExpander::match_matcher): Add option to match delimiters. * expand/rust-macro-expand.h (MacroExpander::match_matcher): Likewise. * parse/rust-parse-impl.h (Parser::skip_token): Add zero argument method. * parse/rust-parse.h: (Parser::skip_token): Likewise. gcc/testsuite/ChangeLog: * rust/compile/macro-delim.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
-rw-r--r--gcc/rust/expand/rust-macro-expand.cc18
-rw-r--r--gcc/rust/expand/rust-macro-expand.h3
-rw-r--r--gcc/rust/parse/rust-parse-impl.h8
-rw-r--r--gcc/rust/parse/rust-parse.h5
-rw-r--r--gcc/testsuite/rust/compile/macro-delim.rs8
5 files changed, 35 insertions, 7 deletions
diff --git a/gcc/rust/expand/rust-macro-expand.cc b/gcc/rust/expand/rust-macro-expand.cc
index c76a353..c29b9c6 100644
--- a/gcc/rust/expand/rust-macro-expand.cc
+++ b/gcc/rust/expand/rust-macro-expand.cc
@@ -352,7 +352,7 @@ MacroExpander::try_match_rule (AST::MacroRule &match_rule,
AST::MacroMatcher &matcher = match_rule.get_matcher ();
expansion_depth++;
- if (!match_matcher (parser, matcher))
+ if (!match_matcher (parser, matcher, false, false))
{
expansion_depth--;
return false;
@@ -437,7 +437,8 @@ MacroExpander::match_fragment (Parser<MacroInvocLexer> &parser,
bool
MacroExpander::match_matcher (Parser<MacroInvocLexer> &parser,
- AST::MacroMatcher &matcher, bool in_repetition)
+ AST::MacroMatcher &matcher, bool in_repetition,
+ bool match_delim)
{
if (depth_exceeds_recursion_limit ())
{
@@ -447,29 +448,34 @@ MacroExpander::match_matcher (Parser<MacroInvocLexer> &parser,
auto delimiter = parser.peek_current_token ();
+ auto check_delim = [&matcher, match_delim] (AST::DelimType delim) {
+ return !match_delim || matcher.get_delim_type () == delim;
+ };
+
// this is used so we can check that we delimit the stream correctly.
switch (delimiter->get_id ())
{
case LEFT_PAREN: {
- if (!parser.skip_token (LEFT_PAREN))
+ if (!check_delim (AST::DelimType::PARENS))
return false;
}
break;
case LEFT_SQUARE: {
- if (!parser.skip_token (LEFT_SQUARE))
+ if (!check_delim (AST::DelimType::SQUARE))
return false;
}
break;
case LEFT_CURLY: {
- if (!parser.skip_token (LEFT_CURLY))
+ if (!check_delim (AST::DelimType::CURLY))
return false;
}
break;
default:
- gcc_unreachable ();
+ return false;
}
+ parser.skip_token ();
const MacroInvocLexer &source = parser.get_token_source ();
diff --git a/gcc/rust/expand/rust-macro-expand.h b/gcc/rust/expand/rust-macro-expand.h
index 06efa22..50277fc 100644
--- a/gcc/rust/expand/rust-macro-expand.h
+++ b/gcc/rust/expand/rust-macro-expand.h
@@ -275,7 +275,8 @@ struct MacroExpander
AST::MacroMatchRepetition &rep);
bool match_matcher (Parser<MacroInvocLexer> &parser,
- AST::MacroMatcher &matcher, bool in_repetition = false);
+ AST::MacroMatcher &matcher, bool in_repetition = false,
+ bool match_delim = true);
/**
* Match any amount of matches
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index af967b5..30f226e 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -12159,6 +12159,14 @@ Parser<ManagedTokenSource>::skip_after_semicolon ()
lexer.skip_token ();
}
+/* Skips the current token */
+template <typename ManagedTokenSource>
+void
+Parser<ManagedTokenSource>::skip_token ()
+{
+ lexer.skip_token ();
+}
+
/* Checks if current token has inputted id - skips it and returns true if so,
* diagnoses an error and returns false otherwise. */
template <typename ManagedTokenSource>
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index 1e7e526..315d3fc 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -95,6 +95,11 @@ template <typename ManagedTokenSource> class Parser
{
public:
/**
+ * Consume a token
+ */
+ void skip_token ();
+
+ /**
* Consume a token, reporting an error if it isn't the next token
*
* @param t ID of the token to consume
diff --git a/gcc/testsuite/rust/compile/macro-delim.rs b/gcc/testsuite/rust/compile/macro-delim.rs
new file mode 100644
index 0000000..de4cd56
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro-delim.rs
@@ -0,0 +1,8 @@
+macro_rules! foo {
+ ([]) => {struct Foo;};
+ (()) => {struct _A;};
+ (bool) => {struct _B;};
+}
+
+foo! (());
+foo! (bool);