aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-05-08 20:58:59 -0400
committerCohenArthur <arthur.cohen@embecosm.com>2023-05-12 11:28:13 +0000
commit142b84e3c56252004348f57c0822dca39d437395 (patch)
treeb6f6cbf2603eebd3207331cd1914b4b028a754a3 /gcc
parentdc809645295e424285cd05df655d8c0084e546b8 (diff)
downloadgcc-142b84e3c56252004348f57c0822dca39d437395.zip
gcc-142b84e3c56252004348f57c0822dca39d437395.tar.gz
gcc-142b84e3c56252004348f57c0822dca39d437395.tar.bz2
Handle keywords in macro fragments
gcc/rust/ChangeLog: * lex/rust-token.cc (token_id_is_keyword): New. (token_id_keyword_string): New. * lex/rust-token.h (token_id_is_keyword): New. (token_id_keyword_string): New. * expand/rust-macro-expand.cc (MacroExpander::match_fragment): Match keywords for ident fragment. * parse/rust-parse-impl.h (Parser::parse_identifier_or_keyword_token): Add. * parse/rust-parse.h (Parser::parse_identifier_or_keyword_token): Add. gcc/testsuite/ChangeLog: * rust/compile/macro-issue2192.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.cc2
-rw-r--r--gcc/rust/lex/rust-token.cc34
-rw-r--r--gcc/rust/lex/rust-token.h6
-rw-r--r--gcc/rust/parse/rust-parse-impl.h18
-rw-r--r--gcc/rust/parse/rust-parse.h1
-rw-r--r--gcc/testsuite/rust/compile/macro-issue2192.rs7
6 files changed, 67 insertions, 1 deletions
diff --git a/gcc/rust/expand/rust-macro-expand.cc b/gcc/rust/expand/rust-macro-expand.cc
index c28f4b6..b607cd5 100644
--- a/gcc/rust/expand/rust-macro-expand.cc
+++ b/gcc/rust/expand/rust-macro-expand.cc
@@ -378,7 +378,7 @@ MacroExpander::match_fragment (Parser<MacroInvocLexer> &parser,
break;
case AST::MacroFragSpec::IDENT:
- parser.parse_identifier_pattern ();
+ parser.parse_identifier_or_keyword_token ();
break;
case AST::MacroFragSpec::LITERAL:
diff --git a/gcc/rust/lex/rust-token.cc b/gcc/rust/lex/rust-token.cc
index f7b089e..179560d 100644
--- a/gcc/rust/lex/rust-token.cc
+++ b/gcc/rust/lex/rust-token.cc
@@ -57,6 +57,40 @@ token_id_to_str (TokenId id)
}
}
+/* checks if a token is a keyword */
+bool
+token_id_is_keyword (TokenId id)
+{
+ switch (id)
+ {
+#define RS_TOKEN_KEYWORD(name, _) case name:
+#define RS_TOKEN(a, b)
+ RS_TOKEN_LIST return true;
+#undef RS_TOKEN_KEYWORD
+#undef RS_TOKEN
+ default:
+ return false;
+ }
+}
+
+/* gets the string associated with a keyword */
+const char *
+token_id_keyword_string (TokenId id)
+{
+ switch (id)
+ {
+#define RS_TOKEN_KEYWORD(id, str) \
+ case id: \
+ return str;
+#define RS_TOKEN(a, b)
+ RS_TOKEN_LIST
+#undef RS_TOKEN_KEYWORD
+#undef RS_TOKEN
+ default:
+ return nullptr;
+ }
+}
+
const char *
get_type_hint_string (PrimitiveCoreType type)
{
diff --git a/gcc/rust/lex/rust-token.h b/gcc/rust/lex/rust-token.h
index 39c21cd..9dea83c 100644
--- a/gcc/rust/lex/rust-token.h
+++ b/gcc/rust/lex/rust-token.h
@@ -226,6 +226,12 @@ get_token_description (TokenId id);
* x-macros */
const char *
token_id_to_str (TokenId id);
+/* checks if a token is a keyword */
+bool
+token_id_is_keyword (TokenId id);
+/* gets the string associated with a keyword */
+const char *
+token_id_keyword_string (TokenId id);
// Get type hint description as a string.
const char *
get_type_hint_string (PrimitiveCoreType type);
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index cdcc8b8..1824545 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -999,6 +999,24 @@ Parser<ManagedTokenSource>::parse_delim_token_tree ()
}
}
+// Parses an identifier/keyword as a Token
+template <typename ManagedTokenSource>
+std::unique_ptr<AST::Token>
+Parser<ManagedTokenSource>::parse_identifier_or_keyword_token ()
+{
+ const_TokenPtr t = lexer.peek_token ();
+
+ if (t->get_id () == IDENTIFIER || token_id_is_keyword (t->get_id ()))
+ {
+ lexer.skip_token ();
+ return std::unique_ptr<AST::Token> (new AST::Token (std::move (t)));
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
/* Parses a TokenTree syntactical production. This is either a delimited token
* tree or a non-delimiter token. */
template <typename ManagedTokenSource>
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index 6957b66..71f0ff1 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -148,6 +148,7 @@ public:
std::vector<std::unique_ptr<AST::LifetimeParam> > parse_lifetime_params ();
AST::Visibility parse_visibility ();
std::unique_ptr<AST::IdentifierPattern> parse_identifier_pattern ();
+ std::unique_ptr<AST::Token> parse_identifier_or_keyword_token ();
std::unique_ptr<AST::TokenTree> parse_token_tree ();
std::tuple<AST::SimplePath, std::unique_ptr<AST::AttrInput>, Location>
parse_attribute_body ();
diff --git a/gcc/testsuite/rust/compile/macro-issue2192.rs b/gcc/testsuite/rust/compile/macro-issue2192.rs
new file mode 100644
index 0000000..deb2dd7
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro-issue2192.rs
@@ -0,0 +1,7 @@
+macro_rules! foo {
+ ($a:ident) => {}
+}
+
+pub fn bar() {
+ foo!(self);
+}