[COMMITTED 25/25] gccrs: Fix macro parsing for trait items.

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Wed Feb 7 11:44:11 GMT 2024


From: Kushal Pal <kushalpal109@gmail.com>

gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h (Parser::parse_trait_item):
	Handle macros in trait items similar to how its handled for trait
	implementation items.

Signed-off-by: Kushal Pal <kushalpal109@gmail.com>
---
 gcc/rust/parse/rust-parse-impl.h | 37 ++++++++++++++++----------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index ed264371db7..ac1754542d4 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -5094,6 +5094,18 @@ Parser<ManagedTokenSource>::parse_trait_item ()
   const_TokenPtr tok = lexer.peek_token ();
   switch (tok->get_id ())
     {
+    case SUPER:
+    case SELF:
+    case CRATE:
+    case DOLLAR_SIGN:
+      // these seem to be SimplePath tokens, so this is a macro invocation
+      // semi
+      return parse_macro_invocation_semi (std::move (outer_attrs));
+    case IDENTIFIER:
+      if (lexer.peek_token ()->get_str () == Values::WeakKeywords::DEFAULT)
+	return parse_function (std::move (vis), std::move (outer_attrs));
+      else
+	return parse_macro_invocation_semi (std::move (outer_attrs));
     case TYPE:
       return parse_trait_type (std::move (outer_attrs), vis);
     case CONST:
@@ -5110,25 +5122,14 @@ Parser<ManagedTokenSource>::parse_trait_item ()
     case EXTERN_KW:
     case FN_KW:
       return parse_function (std::move (vis), std::move (outer_attrs));
-
-      default: {
-	// TODO: try and parse macro invocation semi - if fails, maybe error.
-	std::unique_ptr<AST::TraitItem> macro_invoc
-	  = parse_macro_invocation_semi (outer_attrs);
-
-	if (macro_invoc == nullptr)
-	  {
-	    // TODO: error?
-	    return nullptr;
-	  }
-	else
-	  {
-	    return macro_invoc;
-	  }
-	/* FIXME: macro invocations can only start with certain tokens. be
-	 * more picky with these? */
-      }
+    default:
+      break;
     }
+  add_error (Error (tok->get_locus (),
+		    "unrecognised token %qs for item in trait",
+		    tok->get_token_description ()));
+  // skip?
+  return nullptr;
 }
 
 // Parse a typedef trait item.
-- 
2.42.1



More information about the Gcc-rust mailing list