public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] gccrs: Add all rust keywords (except priv) to the follow-set of `:vis` when parsing macro rules
@ 2023-03-20  7:23 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2023-03-20  7:23 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:0e010fc08b42cf4379e2ad1b51518c22a7f82186

commit 0e010fc08b42cf4379e2ad1b51518c22a7f82186
Author: Tage Johansson <frans.tage@gmail.com>
Date:   Sat Mar 4 19:43:02 2023 +0100

    gccrs: Add all rust keywords (except priv) to the follow-set of `:vis` when parsing macro rules
    
    Previously, the following macro rules were rejected by gccrs:
    ```Rust
    macro_rules! {
        ($v:vis <KEY_WORD>) => { ... };
    }
    ```
    
    This PR fixes so the above code is accepted by the compiler for all key words like `async` or `unsafe`.
    The only exception is the keyword `priv` which is not allowed.
    See [this page](https://doc.rust-lang.org/reference/macro-ambiguity.html) for reference. Especially the following excerpt:
    > FOLLOW(vis) = {,l any keyword or identifier except a non-raw priv; any token that can begin a type; ident, ty, and path nonterminals}.
    
    Fixes #1060
    
    gcc/rust/ChangeLog:
    
            * parse/rust-parse.cc: fix follow-sets
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/macro47.rs: Test that :vis can be followed by some keywords
            * rust/compile/macro48.rs: Test that :vis cannot be followed by the keyword priv
    
    Signed-off-by: Tage Johansson <frans.tage@gmail.com>

Diff:
---
 gcc/rust/parse/rust-parse.cc          | 92 ++++++++++++++++++++++++-----------
 gcc/testsuite/rust/compile/macro47.rs | 10 ++++
 gcc/testsuite/rust/compile/macro48.rs | 10 ++++
 3 files changed, 84 insertions(+), 28 deletions(-)

diff --git a/gcc/rust/parse/rust-parse.cc b/gcc/rust/parse/rust-parse.cc
index f1e2caa258b..1b565bc8f45 100644
--- a/gcc/rust/parse/rust-parse.cc
+++ b/gcc/rust/parse/rust-parse.cc
@@ -17,6 +17,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "rust-parse.h"
 #include "rust-linemap.h"
 #include "rust-diagnostics.h"
+#include "rust-token.h"
 
 namespace Rust {
 
@@ -166,34 +167,69 @@ peculiar_fragment_match_compatible (const AST::MacroMatchFragment &last_match,
 	{MATCH_ARROW, COMMA, EQUAL, PIPE, SEMICOLON, COLON, RIGHT_ANGLE,
 	 RIGHT_SHIFT, LEFT_SQUARE, LEFT_CURLY, AS, WHERE}},
        {AST::MacroFragSpec::VIS,
-	{
-	  COMMA,
-	  IDENTIFIER /* FIXME: Other than `priv` */,
-	  LEFT_PAREN,
-	  LEFT_SQUARE,
-	  EXCLAM,
-	  ASTERISK,
-	  AMP,
-	  LOGICAL_AND,
-	  QUESTION_MARK,
-	  LIFETIME,
-	  LEFT_ANGLE,
-	  LEFT_SHIFT,
-	  SUPER,
-	  SELF,
-	  SELF_ALIAS,
-	  EXTERN_TOK,
-	  CRATE,
-	  UNDERSCORE,
-	  FOR,
-	  IMPL,
-	  FN_TOK,
-	  UNSAFE,
-	  TYPEOF,
-	  DYN
-	  // FIXME: Add Non kw identifiers
-	  // FIXME: Add $crate as valid
-	}}};
+	{COMMA,
+	 IDENTIFIER,
+	 LEFT_PAREN,
+	 LEFT_SQUARE,
+	 EXCLAM,
+	 ASTERISK,
+	 AMP,
+	 LOGICAL_AND,
+	 QUESTION_MARK,
+	 LIFETIME,
+	 LEFT_ANGLE,
+	 LEFT_SHIFT,
+	 UNDERSCORE,
+	 ABSTRACT,
+	 AS,
+	 ASYNC,
+	 AUTO,
+	 BECOME,
+	 BOX,
+	 BREAK,
+	 CONST,
+	 CONTINUE,
+	 CRATE,
+	 DO,
+	 DYN,
+	 ELSE,
+	 ENUM_TOK,
+	 EXTERN_TOK,
+	 FALSE_LITERAL,
+	 FINAL_TOK,
+	 FN_TOK,
+	 FOR,
+	 IF,
+	 IMPL,
+	 IN,
+	 LET,
+	 LOOP,
+	 MACRO,
+	 MATCH_TOK,
+	 MOD,
+	 MOVE,
+	 MUT,
+	 OVERRIDE_TOK,
+	 PUB,
+	 REF,
+	 RETURN_TOK,
+	 SELF_ALIAS,
+	 SELF,
+	 STATIC_TOK,
+	 STRUCT_TOK,
+	 SUPER,
+	 TRAIT,
+	 TRUE_LITERAL,
+	 TRY,
+	 TYPE,
+	 TYPEOF,
+	 UNSAFE,
+	 UNSIZED,
+	 USE,
+	 VIRTUAL,
+	 WHERE,
+	 WHILE,
+	 YIELD}}};
 
   Location error_locus = match.get_match_locus ();
   std::string kind_str = "fragment";
diff --git a/gcc/testsuite/rust/compile/macro47.rs b/gcc/testsuite/rust/compile/macro47.rs
new file mode 100644
index 00000000000..36545af7e16
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro47.rs
@@ -0,0 +1,10 @@
+// Check the follow-set of :vis in macro rules.
+
+macro_rules! my_mac {
+    ($v:vis async) => {
+        $v struct Foo(i32);
+    };
+    ($v:vis $i:ident) => {
+        $v struct $i(i32);
+    }
+}
diff --git a/gcc/testsuite/rust/compile/macro48.rs b/gcc/testsuite/rust/compile/macro48.rs
new file mode 100644
index 00000000000..6b3b369bc3a
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro48.rs
@@ -0,0 +1,10 @@
+// Check that "priv" is not in the follow set of :vis.
+
+// { dg-error "token .priv. is not allowed after .vis. fragment" "#359" { target *-*-* } .+4 }
+// { dg-error "required first macro rule in macro rules definition could not be parsed" "" { target *-*-* } .+3 }
+// { dg-error "failed to parse item in crate" "" { target *-*-* } .+2 }
+macro_rules! my_mac {
+    ($v:vis priv) => {
+        $v struct Foo(i32);
+    }
+}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-20  7:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-20  7:23 [gcc/devel/rust/master] gccrs: Add all rust keywords (except priv) to the follow-set of `:vis` when parsing macro rules Thomas Schwinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).