public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] Extract AsyncConstStatus to be a shared enum between AST and HIR
@ 2022-06-08 12:00 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-06-08 12:00 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:e77f051369efce4207c965ab2b69c5d9867c5846

commit e77f051369efce4207c965ab2b69c5d9867c5846
Author: Philip Herron <philip.herron@embecosm.com>
Date:   Fri Jan 21 20:16:38 2022 +0000

    Extract AsyncConstStatus to be a shared enum between AST and HIR
    
    This allows us to reuse the same enum and fix the uninitilized warning
    as it has already been setup before hand in the AST.
    
    Fixes #875

Diff:
---
 gcc/rust/ast/rust-ast-full-test.cc      |  4 +--
 gcc/rust/ast/rust-item.h                | 59 ++++++++-------------------------
 gcc/rust/ast/rust-type.h                |  2 ++
 gcc/rust/hir/rust-ast-lower-implitem.h  | 16 ++++-----
 gcc/rust/hir/rust-ast-lower-stmt.h      |  4 +--
 gcc/rust/hir/rust-ast-lower-type.h      |  4 +--
 gcc/rust/hir/rust-ast-lower.cc          | 18 ++--------
 gcc/rust/hir/tree/rust-hir-full-test.cc |  4 +--
 gcc/rust/hir/tree/rust-hir-item.h       | 14 +-------
 gcc/rust/parse/rust-parse-impl.h        |  7 ++--
 gcc/rust/util/rust-common.h             |  7 ++++
 11 files changed, 44 insertions(+), 95 deletions(-)

diff --git a/gcc/rust/ast/rust-ast-full-test.cc b/gcc/rust/ast/rust-ast-full-test.cc
index 87808536e07..91bd6a5f2fb 100644
--- a/gcc/rust/ast/rust-ast-full-test.cc
+++ b/gcc/rust/ast/rust-ast-full-test.cc
@@ -2288,10 +2288,10 @@ FunctionQualifiers::as_string () const
     case NONE:
       // do nothing
       break;
-    case CONST:
+    case CONST_FN:
       str += "const ";
       break;
-    case ASYNC:
+    case ASYNC_FN:
       str += "async ";
       break;
     default:
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index ad503cfce23..1829358d929 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -21,6 +21,7 @@
 
 #include "rust-ast.h"
 #include "rust-path.h"
+#include "rust-common.h"
 
 namespace Rust {
 namespace AST {
@@ -487,12 +488,6 @@ struct FunctionQualifiers
 public:
   /* Whether the function is neither const nor async, const only, or async
    * only. */
-  enum AsyncConstStatus
-  {
-    NONE,
-    CONST,
-    ASYNC
-  };
 
 private:
   AsyncConstStatus const_status;
@@ -705,34 +700,17 @@ protected:
 // A method (function belonging to a type)
 class Method : public InherentImplItem, public TraitImplItem
 {
-  // moved from impl items for consistency
   std::vector<Attribute> outer_attrs;
   Visibility vis;
-
   FunctionQualifiers qualifiers;
   Identifier method_name;
-
-  // bool has_generics;
-  // Generics generic_params;
-  std::vector<std::unique_ptr<GenericParam>> generic_params; // inlined
-
+  std::vector<std::unique_ptr<GenericParam>> generic_params;
   SelfParam self_param;
-
-  // bool has_params;
-  // FunctionParams function_params;
-  std::vector<FunctionParam> function_params; // inlined
-
-  // bool has_return_type;
-  // FunctionReturnType return_type;
-  std::unique_ptr<Type> return_type; // inlined
-
-  // bool has_where_clause;
+  std::vector<FunctionParam> function_params;
+  std::unique_ptr<Type> return_type;
   WhereClause where_clause;
-
   std::unique_ptr<BlockExpr> function_body;
-
   Location locus;
-
   NodeId node_id;
 
 public:
@@ -746,7 +724,7 @@ public:
   // Creates an error state method.
   static Method create_error ()
   {
-    return Method ("", FunctionQualifiers (FunctionQualifiers::NONE, true),
+    return Method ("", FunctionQualifiers (NONE, true),
 		   std::vector<std::unique_ptr<GenericParam>> (),
 		   SelfParam::create_error (), std::vector<FunctionParam> (),
 		   nullptr, WhereClause::create_empty (), nullptr,
@@ -904,6 +882,8 @@ public:
 
   Location get_locus () const override final { return locus; }
 
+  FunctionQualifiers get_qualifiers () { return qualifiers; }
+
 protected:
   /* Use covariance to implement clone function as returning this object
    * rather than base */
@@ -1439,11 +1419,6 @@ protected:
   }
 };
 
-// Parameters used in a function - TODO inline?
-/*struct FunctionParams {
-    std::vector<FunctionParam> function_params;
-};*/
-
 class LetStmt;
 
 // Rust function declaration AST node
@@ -1451,23 +1426,11 @@ class Function : public VisItem, public InherentImplItem, public TraitImplItem
 {
   FunctionQualifiers qualifiers;
   Identifier function_name;
-
-  // bool has_generics;
-  // Generics generic_params;
-  std::vector<std::unique_ptr<GenericParam>> generic_params; // inlined
-
-  // bool has_function_params;
-  // FunctionParams function_params;
-  std::vector<FunctionParam> function_params; // inlined
-
-  // bool has_function_return_type;
+  std::vector<std::unique_ptr<GenericParam>> generic_params;
+  std::vector<FunctionParam> function_params;
   std::unique_ptr<Type> return_type;
-
-  // bool has_where_clause;
   WhereClause where_clause;
-
   std::unique_ptr<BlockExpr> function_body;
-
   Location locus;
 
 public:
@@ -2841,6 +2804,8 @@ public:
 
   // TODO: is this better? Or is a "vis_block" better?
   WhereClause &get_where_clause () { return where_clause; }
+
+  FunctionQualifiers get_qualifiers () { return qualifiers; }
 };
 
 // Actual trait item function declaration within traits
@@ -3067,6 +3032,8 @@ public:
 
   SelfParam &get_self_param () { return self_param; }
   const SelfParam &get_self_param () const { return self_param; }
+
+  FunctionQualifiers get_qualifiers () { return qualifiers; }
 };
 
 // Actual trait item method declaration within traits
diff --git a/gcc/rust/ast/rust-type.h b/gcc/rust/ast/rust-type.h
index 2414b600c80..9f7fb54f2ae 100644
--- a/gcc/rust/ast/rust-type.h
+++ b/gcc/rust/ast/rust-type.h
@@ -928,6 +928,8 @@ public:
     return return_type;
   }
 
+  FunctionQualifiers get_function_qualifiers () { return function_qualifiers; }
+
 protected:
   /* Use covariance to implement clone function as returning this object rather
    * than base */
diff --git a/gcc/rust/hir/rust-ast-lower-implitem.h b/gcc/rust/hir/rust-ast-lower-implitem.h
index 3613df52c0a..f68b3f0b315 100644
--- a/gcc/rust/hir/rust-ast-lower-implitem.h
+++ b/gcc/rust/hir/rust-ast-lower-implitem.h
@@ -118,8 +118,8 @@ public:
     // ignore for now and leave empty
     std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::FunctionQualifiers qualifiers (
-      HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal);
+    HIR::FunctionQualifiers qualifiers
+      = lower_qualifiers (function.get_qualifiers ());
     HIR::Visibility vis = HIR::Visibility::create_public ();
 
     // need
@@ -202,8 +202,8 @@ public:
     // ignore for now and leave empty
     std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::FunctionQualifiers qualifiers (
-      HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal);
+    HIR::FunctionQualifiers qualifiers
+      = lower_qualifiers (method.get_qualifiers ());
     HIR::Visibility vis = HIR::Visibility::create_public ();
 
     // need
@@ -314,8 +314,8 @@ public:
 
     std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::FunctionQualifiers qualifiers (
-      HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal);
+    HIR::FunctionQualifiers qualifiers
+      = lower_qualifiers (func.get_trait_function_decl ().get_qualifiers ());
 
     std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
     if (ref.has_generics ())
@@ -392,8 +392,8 @@ public:
 
     std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::FunctionQualifiers qualifiers (
-      HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal);
+    HIR::FunctionQualifiers qualifiers
+      = lower_qualifiers (method.get_trait_method_decl ().get_qualifiers ());
 
     std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
     if (ref.has_generics ())
diff --git a/gcc/rust/hir/rust-ast-lower-stmt.h b/gcc/rust/hir/rust-ast-lower-stmt.h
index 27fdd22f708..5ce573e13cd 100644
--- a/gcc/rust/hir/rust-ast-lower-stmt.h
+++ b/gcc/rust/hir/rust-ast-lower-stmt.h
@@ -356,8 +356,8 @@ public:
     // ignore for now and leave empty
     std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::FunctionQualifiers qualifiers (
-      HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal);
+    HIR::FunctionQualifiers qualifiers
+      = lower_qualifiers (function.get_qualifiers ());
     HIR::Visibility vis = HIR::Visibility::create_public ();
 
     // need
diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h
index 858984c3710..4042908b5cb 100644
--- a/gcc/rust/hir/rust-ast-lower-type.h
+++ b/gcc/rust/hir/rust-ast-lower-type.h
@@ -135,8 +135,8 @@ public:
   {
     bool is_variadic = false;
     std::vector<HIR::LifetimeParam> lifetime_params;
-    HIR::FunctionQualifiers qualifiers (
-      HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal);
+    HIR::FunctionQualifiers qualifiers
+      = lower_qualifiers (fntype.get_function_qualifiers ());
 
     std::vector<HIR::MaybeNamedParam> named_params;
     for (auto &param : fntype.get_function_params ())
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index d6f5cf26b0f..87fc5231e15 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -597,20 +597,6 @@ struct_field_name_exists (std::vector<HIR::StructField> &fields,
 HIR::FunctionQualifiers
 ASTLoweringBase::lower_qualifiers (const AST::FunctionQualifiers &qualifiers)
 {
-  HIR::FunctionQualifiers::AsyncConstStatus const_status;
-  switch (qualifiers.get_const_status ())
-    {
-    case AST::FunctionQualifiers::AsyncConstStatus::NONE:
-      const_status = HIR::FunctionQualifiers::AsyncConstStatus::NONE;
-      break;
-    case AST::FunctionQualifiers::AsyncConstStatus::CONST:
-      const_status = HIR::FunctionQualifiers::AsyncConstStatus::CONST;
-      break;
-    case AST::FunctionQualifiers::AsyncConstStatus::ASYNC:
-      const_status = HIR::FunctionQualifiers::AsyncConstStatus::ASYNC;
-      break;
-    }
-
   Unsafety unsafety
     = qualifiers.is_unsafe () ? Unsafety::Unsafe : Unsafety::Normal;
   bool has_extern = qualifiers.is_extern ();
@@ -618,8 +604,8 @@ ASTLoweringBase::lower_qualifiers (const AST::FunctionQualifiers &qualifiers)
   // FIXME turn this into the Rust::ABI enum
   std::string extern_abi = qualifiers.get_extern_abi ();
 
-  return HIR::FunctionQualifiers (const_status, unsafety, has_extern,
-				  extern_abi);
+  return HIR::FunctionQualifiers (qualifiers.get_const_status (), unsafety,
+				  has_extern, extern_abi);
 }
 
 } // namespace HIR
diff --git a/gcc/rust/hir/tree/rust-hir-full-test.cc b/gcc/rust/hir/tree/rust-hir-full-test.cc
index adc8eeae55e..50979d4f1fb 100644
--- a/gcc/rust/hir/tree/rust-hir-full-test.cc
+++ b/gcc/rust/hir/tree/rust-hir-full-test.cc
@@ -2040,10 +2040,10 @@ FunctionQualifiers::as_string () const
     case NONE:
       // do nothing
       break;
-    case CONST:
+    case CONST_FN:
       str += "const ";
       break;
-    case ASYNC:
+    case ASYNC_FN:
       str += "async ";
       break;
     default:
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h
index 09f9d381ef5..cd8b960eaf0 100644
--- a/gcc/rust/hir/tree/rust-hir-item.h
+++ b/gcc/rust/hir/tree/rust-hir-item.h
@@ -477,16 +477,6 @@ public:
 // Qualifiers for function, i.e. const, unsafe, extern etc.
 struct FunctionQualifiers
 {
-public:
-  /* Whether the function is neither const nor async, const only, or async
-   * only. */
-  enum AsyncConstStatus
-  {
-    NONE,
-    CONST,
-    ASYNC
-  };
-
 private:
   AsyncConstStatus const_status;
   Unsafety unsafety;
@@ -494,8 +484,6 @@ private:
   std::string extern_abi; // e.g. extern "C" fn() -> i32 {}
   // TODO: maybe ensure that extern_abi only exists if extern exists?
 
-  // should this store location info?
-
 public:
   FunctionQualifiers (AsyncConstStatus const_status, Unsafety unsafety,
 		      bool has_extern = false,
@@ -514,7 +502,7 @@ public:
 
   AsyncConstStatus get_status () const { return const_status; }
 
-  bool is_const () const { return const_status == AsyncConstStatus::CONST; }
+  bool is_const () const { return const_status == AsyncConstStatus::CONST_FN; }
 };
 
 // A function parameter
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index aabb15cb128..0e39e483a0d 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -2602,8 +2602,7 @@ template <typename ManagedTokenSource>
 AST::FunctionQualifiers
 Parser<ManagedTokenSource>::parse_function_qualifiers ()
 {
-  AST::FunctionQualifiers::AsyncConstStatus const_status
-    = AST::FunctionQualifiers::NONE;
+  AsyncConstStatus const_status = NONE;
   // bool has_const = false;
   bool has_unsafe = false;
   bool has_extern = false;
@@ -2615,11 +2614,11 @@ Parser<ManagedTokenSource>::parse_function_qualifiers ()
     {
     case CONST:
       lexer.skip_token ();
-      const_status = AST::FunctionQualifiers::CONST;
+      const_status = CONST_FN;
       break;
     case ASYNC:
       lexer.skip_token ();
-      const_status = AST::FunctionQualifiers::ASYNC;
+      const_status = ASYNC_FN;
       break;
     default:
       // const status is still none
diff --git a/gcc/rust/util/rust-common.h b/gcc/rust/util/rust-common.h
index 6d511ba62ac..b8a2ac35ba4 100644
--- a/gcc/rust/util/rust-common.h
+++ b/gcc/rust/util/rust-common.h
@@ -41,6 +41,13 @@ enum Polarity
   Negative
 };
 
+enum AsyncConstStatus
+{
+  NONE,
+  CONST_FN,
+  ASYNC_FN
+};
+
 } // namespace Rust
 
 #endif // RUST_COMMON


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

only message in thread, other threads:[~2022-06-08 12:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-08 12:00 [gcc/devel/rust/master] Extract AsyncConstStatus to be a shared enum between AST and HIR 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).