]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fix macro parsing for trait items.
authorKushal Pal <kushalpal109@gmail.com>
Fri, 26 Jan 2024 13:05:59 +0000 (18:35 +0530)
committerArthur Cohen <arthur.cohen@embecosm.com>
Wed, 7 Feb 2024 11:40:24 +0000 (12:40 +0100)
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

index ed264371db7ff232106cfc40513e0cb0ec2094d9..ac1754542d437eca7685475019d23b7c7a467822 100644 (file)
@@ -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.