From: Kushal Pal <[email protected]>

gcc/rust/ChangeLog:

        * ast/rust-ast-builder.cc (AstBuilder::fn_qualifiers):
        Add new parameter.
        * ast/rust-ast-builder.h: Likewise.
        * ast/rust-ast.cc (Function::Function):
        Remove current default parameter.
        (Function::operator=):
        Remove current default parameter.
        * ast/rust-item.h (class FunctionQualifiers):
        Add data member to represent defaultness of a function.
        (class Function):
        Remove current default parameter.
        * parse/rust-parse-impl.hxx (Parser::parse_function_qualifiers):
        Parse function qualifiers in order.
        * util/rust-common.h (enum class): Create enum to represent
        defaultness of a function.

Signed-off-by: Kushal Pal <[email protected]>
---
 gcc/rust/ast/rust-ast-builder.cc   |  3 +-
 gcc/rust/ast/rust-ast-builder.h    |  4 +--
 gcc/rust/ast/rust-ast.cc           |  2 --
 gcc/rust/ast/rust-item.h           | 20 ++++++-----
 gcc/rust/parse/rust-parse-impl.hxx | 55 +++++++++++++-----------------
 gcc/rust/util/rust-common.h        |  6 ++++
 6 files changed, 44 insertions(+), 46 deletions(-)

diff --git a/gcc/rust/ast/rust-ast-builder.cc b/gcc/rust/ast/rust-ast-builder.cc
index 46a7883b5da..bce5bb85a4f 100644
--- a/gcc/rust/ast/rust-ast-builder.cc
+++ b/gcc/rust/ast/rust-ast-builder.cc
@@ -149,7 +149,8 @@ Builder::function_param (std::unique_ptr<Pattern> &&pattern,
 FunctionQualifiers
 Builder::fn_qualifiers () const
 {
-  return FunctionQualifiers (loc, Async::No, Const::No, Unsafety::Normal);
+  return FunctionQualifiers (loc, Default::No, Async::No, Const::No,
+                            Unsafety::Normal);
 }
 
 std::unique_ptr<Function>
diff --git a/gcc/rust/ast/rust-ast-builder.h b/gcc/rust/ast/rust-ast-builder.h
index 1b642e4afc9..2b34c2ab1e2 100644
--- a/gcc/rust/ast/rust-ast-builder.h
+++ b/gcc/rust/ast/rust-ast-builder.h
@@ -188,8 +188,8 @@ public:
            std::unique_ptr<Type> return_type, std::unique_ptr<BlockExpr> block,
            std::vector<std::unique_ptr<GenericParam>> generic_params = {},
            FunctionQualifiers qualifiers
-           = FunctionQualifiers (UNKNOWN_LOCATION, Async::No, Const::No,
-                                 Unsafety::Normal),
+           = FunctionQualifiers (UNKNOWN_LOCATION, Default::No, Async::No,
+                                 Const::No, Unsafety::Normal),
            WhereClause where_clause = WhereClause::create_empty (),
            Visibility visibility = Visibility::create_private ()) const;
 
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index e8897696a47..5880ea92fd3 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -1106,7 +1106,6 @@ Function::Function (Function const &other)
   : VisItem (other), ExternalItem (other.get_node_id ()),
     qualifiers (other.qualifiers), function_name (other.function_name),
     where_clause (other.where_clause), locus (other.locus),
-    has_default (other.has_default),
     is_external_function (other.is_external_function)
 {
   // guard to prevent null dereference (always required)
@@ -1138,7 +1137,6 @@ Function::operator= (Function const &other)
   // visibility = other.visibility->clone_visibility();
   // outer_attrs = other.outer_attrs;
   locus = other.locus;
-  has_default = other.has_default;
   is_external_function = other.is_external_function;
 
   // guard to prevent null dereference (always required)
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index 2347978244c..91c52d2cc70 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -547,6 +547,7 @@ public:
 // Qualifiers for function, i.e. const, unsafe, extern etc.
 class FunctionQualifiers
 {
+  Default default_status;
   Async async_status;
   Const const_status;
   Unsafety unsafe_status;
@@ -555,12 +556,14 @@ class FunctionQualifiers
   location_t locus;
 
 public:
-  FunctionQualifiers (location_t locus, Async async_status, Const const_status,
+  FunctionQualifiers (location_t locus, Default default_status,
+                     Async async_status, Const const_status,
                      Unsafety unsafe_status, bool has_extern = false,
                      std::string extern_abi = std::string ())
-    : async_status (async_status), const_status (const_status),
-      unsafe_status (unsafe_status), has_extern (has_extern),
-      extern_abi (std::move (extern_abi)), locus (locus)
+    : default_status (default_status), async_status (async_status),
+      const_status (const_status), unsafe_status (unsafe_status),
+      has_extern (has_extern), extern_abi (std::move (extern_abi)),
+      locus (locus)
   {
     if (!this->extern_abi.empty ())
       {
@@ -571,6 +574,7 @@ public:
 
   std::string as_string () const;
 
+  bool is_default () const { return default_status == Default::Yes; }
   bool is_unsafe () const { return unsafe_status == Unsafety::Unsafe; }
   bool is_extern () const { return has_extern; }
   bool is_const () const { return const_status == Const::Yes; }
@@ -1343,7 +1347,6 @@ class Function : public VisItem, public AssociatedItem, 
public ExternalItem
   WhereClause where_clause;
   tl::optional<std::unique_ptr<BlockExpr>> function_body;
   location_t locus;
-  bool has_default;
   bool is_external_function;
 
 public:
@@ -1368,7 +1371,7 @@ public:
 
   bool has_body () const { return function_body.has_value (); }
 
-  bool is_default () const { return has_default; }
+  bool is_default () const { return qualifiers.is_default (); }
 
   // Mega-constructor with all possible fields
   Function (Identifier function_name, FunctionQualifiers qualifiers,
@@ -1377,8 +1380,7 @@ public:
            std::unique_ptr<Type> return_type, WhereClause where_clause,
            tl::optional<std::unique_ptr<BlockExpr>> function_body,
            Visibility vis, std::vector<Attribute> outer_attrs,
-           location_t locus, bool has_default = false,
-           bool is_external_function = false)
+           location_t locus, bool is_external_function = false)
     : VisItem (std::move (vis), std::move (outer_attrs)),
       ExternalItem (Stmt::node_id), qualifiers (std::move (qualifiers)),
       function_name (std::move (function_name)),
@@ -1387,7 +1389,7 @@ public:
       return_type (std::move (return_type)),
       where_clause (std::move (where_clause)),
       function_body (std::move (function_body)), locus (locus),
-      has_default (has_default), is_external_function (is_external_function)
+      is_external_function (is_external_function)
   {}
 
   // TODO: add constructor with less fields
diff --git a/gcc/rust/parse/rust-parse-impl.hxx 
b/gcc/rust/parse/rust-parse-impl.hxx
index c2ddb17c2e0..8c60ac38245 100644
--- a/gcc/rust/parse/rust-parse-impl.hxx
+++ b/gcc/rust/parse/rust-parse-impl.hxx
@@ -1638,7 +1638,7 @@ Parser<ManagedTokenSource>::parse_function 
(AST::Visibility vis,
                       std::move (generic_params), std::move (function_params),
                       std::move (return_type), std::move (where_clause),
                       std::move (body), std::move (vis),
-                      std::move (outer_attrs), locus, false, is_external));
+                      std::move (outer_attrs), locus, is_external));
 }
 
 // Parses function or method qualifiers (i.e. const, unsafe, and extern).
@@ -1646,6 +1646,7 @@ template <typename ManagedTokenSource>
 AST::FunctionQualifiers
 Parser<ManagedTokenSource>::parse_function_qualifiers ()
 {
+  Default default_status = Default::No;
   Async async_status = Async::No;
   Const const_status = Const::No;
   Unsafety unsafe_status = Unsafety::Normal;
@@ -1653,29 +1654,27 @@ Parser<ManagedTokenSource>::parse_function_qualifiers ()
   std::string abi;
 
   const_TokenPtr t;
-  location_t locus;
-  // Check in order of const, unsafe, then extern
-  for (int i = 0; i < 2; i++)
+  location_t locus = lexer.peek_token ()->get_locus ();
+  // Check in order of default, const, async, unsafe, extern
+  if (lexer.peek_token ()->get_id () == IDENTIFIER
+       && lexer.peek_token ()->get_str () == Values::WeakKeywords::DEFAULT)
     {
-      t = lexer.peek_token ();
-      locus = t->get_locus ();
+      default_status = Default::Yes;
+      lexer.skip_token();
+    }
 
-      switch (t->get_id ())
-       {
-       case CONST:
-         lexer.skip_token ();
-         const_status = Const::Yes;
-         break;
-       case ASYNC:
-         lexer.skip_token ();
-         async_status = Async::Yes;
-         break;
-       default:
-         // const status is still none
-         break;
-       }
+  if (lexer.peek_token ()->get_id () == CONST)
+    {
+      lexer.skip_token ();
+      const_status = Const::Yes;
     }
 
+  if (lexer.peek_token ()->get_id () == ASYNC)
+    {
+      lexer.skip_token ();
+      async_status = Async::Yes;
+     }
+
   if (lexer.peek_token ()->get_id () == UNSAFE)
     {
       lexer.skip_token ();
@@ -1696,8 +1695,9 @@ Parser<ManagedTokenSource>::parse_function_qualifiers ()
        }
     }
 
-  return AST::FunctionQualifiers (locus, async_status, const_status,
-                                 unsafe_status, has_extern, std::move (abi));
+  return AST::FunctionQualifiers (locus, default_status, async_status,
+                                  const_status, unsafe_status, has_extern,
+                                  std::move (abi));
 }
 
 // Parses generic (lifetime or type) params inside angle brackets (optional).
@@ -4456,15 +4456,6 @@ 
Parser<ManagedTokenSource>::parse_trait_impl_function_or_method (
   // - template?
   location_t locus = lexer.peek_token ()->get_locus ();
 
-  auto is_default = false;
-  auto t = lexer.peek_token ();
-  if (t->get_id () == IDENTIFIER
-      && t->get_str () == Values::WeakKeywords::DEFAULT)
-    {
-      is_default = true;
-      lexer.skip_token ();
-    }
-
   // parse function or method qualifiers
   AST::FunctionQualifiers qualifiers = parse_function_qualifiers ();
 
@@ -4601,7 +4592,7 @@ 
Parser<ManagedTokenSource>::parse_trait_impl_function_or_method (
                       std::move (generic_params), std::move (function_params),
                       std::move (return_type), std::move (where_clause),
                       std::move (body), std::move (vis),
-                      std::move (outer_attrs), locus, is_default));
+                      std::move (outer_attrs), locus));
 }
 
 // Parses an extern block of declarations.
diff --git a/gcc/rust/util/rust-common.h b/gcc/rust/util/rust-common.h
index 490668f0d5d..e1af08308f7 100644
--- a/gcc/rust/util/rust-common.h
+++ b/gcc/rust/util/rust-common.h
@@ -48,6 +48,12 @@ enum class Async
   No
 };
 
+enum class Default
+{
+  Yes,
+  No
+};
+
 enum BoundPolarity
 {
   RegularBound,
-- 
2.50.1

Reply via email to