public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] gccrs: refactor is_concrete to not just virtual dispatch
@ 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:75ad892c42fa5bbd6ebd4b11e910e049365694fa

commit 75ad892c42fa5bbd6ebd4b11e910e049365694fa
Author: Philip Herron <herron.philip@googlemail.com>
Date:   Fri Mar 10 14:10:54 2023 +0000

    gccrs: refactor is_concrete to not just virtual dispatch
    
    Its easier to debug and maintain one base function for this than relying
    on virtual dispatch
    
    Signed-off-by: Philip Herron <herron.philip@googlemail.com>
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-tyty.cc (BaseType::is_concrete): new implementation
            (InferType::is_concrete): remove
            (ErrorType::is_concrete): likewise
            (StructFieldType::is_concrete): likewise
            (ADTType::is_concrete): likewise
            (TupleType::is_concrete): likewise
            (BoolType::is_concrete): likewise
            (IntType::is_concrete): likewise
            (UintType::is_concrete): likewise
            (FloatType::is_concrete): likewise
            (USizeType::is_concrete): likewise
            (ISizeType::is_concrete): likewise
            (CharType::is_concrete): likewise
            (ReferenceType::is_concrete): likewise
            (PointerType::is_concrete): likewise
            (ParamType::is_concrete): likewise
            (StrType::is_concrete): likewise
            (NeverType::is_concrete): likewise
            (PlaceholderType::is_concrete): likewise
            (ProjectionType::is_concrete): likewise
            (DynamicObjectType::is_concrete): likewise
            * typecheck/rust-tyty.h: update header

Diff:
---
 gcc/rust/typecheck/rust-tyty.cc | 275 ++++++++++++++++++----------------------
 gcc/rust/typecheck/rust-tyty.h  |  79 +-----------
 2 files changed, 127 insertions(+), 227 deletions(-)

diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc
index e6dfc561fbf..3e399fd862e 100644
--- a/gcc/rust/typecheck/rust-tyty.cc
+++ b/gcc/rust/typecheck/rust-tyty.cc
@@ -549,6 +549,132 @@ BaseType::debug () const
 	      debug_str ().c_str ());
 }
 
+bool
+BaseType::is_concrete () const
+{
+  const TyTy::BaseType *x = destructure ();
+  switch (x->get_kind ())
+    {
+    case PARAM:
+    case PROJECTION:
+      return false;
+
+      // placeholder is a special case for this case when it is not resolvable
+      // it means we its just an empty placeholder associated type which is
+      // concrete
+    case PLACEHOLDER:
+      return true;
+
+      case FNDEF: {
+	const FnType &fn = *static_cast<const FnType *> (x);
+	for (const auto &param : fn.get_params ())
+	  {
+	    const BaseType *p = param.second;
+	    if (!p->is_concrete ())
+	      return false;
+	  }
+	return fn.get_return_type ()->is_concrete ();
+      }
+      break;
+
+      case FNPTR: {
+	const FnPtr &fn = *static_cast<const FnPtr *> (x);
+	for (const auto &param : fn.get_params ())
+	  {
+	    const BaseType *p = param.get_tyty ();
+	    if (!p->is_concrete ())
+	      return false;
+	  }
+	return fn.get_return_type ()->is_concrete ();
+      }
+      break;
+
+      case ADT: {
+	const ADTType &adt = *static_cast<const ADTType *> (x);
+	if (adt.is_unit ())
+	  {
+	    return !adt.needs_substitution ();
+	  }
+
+	for (auto &variant : adt.get_variants ())
+	  {
+	    bool is_num_variant
+	      = variant->get_variant_type () == VariantDef::VariantType::NUM;
+	    if (is_num_variant)
+	      continue;
+
+	    for (auto &field : variant->get_fields ())
+	      {
+		const BaseType *field_type = field->get_field_type ();
+		if (!field_type->is_concrete ())
+		  return false;
+	      }
+	  }
+	return true;
+      }
+      break;
+
+      case ARRAY: {
+	const ArrayType &arr = *static_cast<const ArrayType *> (x);
+	return arr.get_element_type ()->is_concrete ();
+      }
+      break;
+
+      case SLICE: {
+	const SliceType &slice = *static_cast<const SliceType *> (x);
+	return slice.get_element_type ()->is_concrete ();
+      }
+      break;
+
+      case POINTER: {
+	const PointerType &ptr = *static_cast<const PointerType *> (x);
+	return ptr.get_base ()->is_concrete ();
+      }
+      break;
+
+      case REF: {
+	const ReferenceType &ref = *static_cast<const ReferenceType *> (x);
+	return ref.get_base ()->is_concrete ();
+      }
+      break;
+
+      case TUPLE: {
+	const TupleType &tuple = *static_cast<const TupleType *> (x);
+	for (size_t i = 0; i < tuple.num_fields (); i++)
+	  {
+	    if (!tuple.get_field (i)->is_concrete ())
+	      return false;
+	  }
+	return true;
+      }
+      break;
+
+      case CLOSURE: {
+	const ClosureType &closure = *static_cast<const ClosureType *> (x);
+	if (closure.get_parameters ().is_concrete ())
+	  return false;
+	return closure.get_result_type ().is_concrete ();
+      }
+      break;
+
+    case INFER:
+    case BOOL:
+    case CHAR:
+    case INT:
+    case UINT:
+    case FLOAT:
+    case USIZE:
+    case ISIZE:
+    case NEVER:
+    case STR:
+    case DYNAMIC:
+    case ERROR:
+      return true;
+    }
+
+  return false;
+}
+
 // InferType
 
 InferType::InferType (HirId ref, InferTypeKind infer_kind, Location locus,
@@ -577,12 +703,6 @@ InferType::get_name () const
   return as_string ();
 }
 
-bool
-InferType::is_concrete () const
-{
-  return true;
-}
-
 void
 InferType::accept_vis (TyVisitor &vis)
 {
@@ -698,11 +818,6 @@ ErrorType::is_unit () const
 {
   return true;
 }
-bool
-ErrorType::is_concrete () const
-{
-  return false;
-}
 
 std::string
 ErrorType::get_name () const
@@ -777,12 +892,6 @@ StructFieldType::set_field_type (BaseType *fty)
   ty = fty;
 }
 
-bool
-StructFieldType::is_concrete () const
-{
-  return ty->is_concrete ();
-}
-
 void
 StructFieldType::debug () const
 {
@@ -1094,30 +1203,6 @@ ADTType::as_string () const
   return identifier + subst_as_string () + "{" + variants_buffer + "}";
 }
 
-bool
-ADTType::is_concrete () const
-{
-  if (is_unit ())
-    {
-      return !needs_substitution ();
-    }
-
-  for (auto &variant : variants)
-    {
-      bool is_num_variant
-	= variant->get_variant_type () == VariantDef::VariantType::NUM;
-      if (is_num_variant)
-	continue;
-
-      for (auto &field : variant->get_fields ())
-	{
-	  if (!field->is_concrete ())
-	    return false;
-	}
-    }
-  return true;
-}
-
 bool
 ADTType::can_eq (const BaseType *other, bool emit_errors) const
 {
@@ -1315,17 +1400,6 @@ TupleType::num_fields () const
   return fields.size ();
 }
 
-bool
-TupleType::is_concrete () const
-{
-  for (size_t i = 0; i < num_fields (); i++)
-    {
-      if (!get_field (i)->is_concrete ())
-	return false;
-    }
-  return true;
-}
-
 const std::vector<TyVar> &
 TupleType::get_fields () const
 {
@@ -2042,12 +2116,6 @@ BoolType::get_name () const
   return as_string ();
 }
 
-bool
-BoolType::is_concrete () const
-{
-  return true;
-}
-
 void
 BoolType::accept_vis (TyVisitor &vis)
 {
@@ -2177,12 +2245,6 @@ IntType::is_equal (const BaseType &other) const
   return get_int_kind () == o.get_int_kind ();
 }
 
-bool
-IntType::is_concrete () const
-{
-  return true;
-}
-
 // UintType
 
 UintType::UintType (HirId ref, UintKind kind, std::set<HirId> refs)
@@ -2276,12 +2338,6 @@ UintType::is_equal (const BaseType &other) const
   return get_uint_kind () == o.get_uint_kind ();
 }
 
-bool
-UintType::is_concrete () const
-{
-  return true;
-}
-
 // FloatType
 
 FloatType::FloatType (HirId ref, FloatKind kind, std::set<HirId> refs)
@@ -2313,12 +2369,6 @@ FloatType::get_float_kind () const
   return float_kind;
 }
 
-bool
-FloatType::is_concrete () const
-{
-  return true;
-}
-
 void
 FloatType::accept_vis (TyVisitor &vis)
 {
@@ -2397,12 +2447,6 @@ USizeType::get_name () const
   return as_string ();
 }
 
-bool
-USizeType::is_concrete () const
-{
-  return true;
-}
-
 void
 USizeType::accept_vis (TyVisitor &vis)
 {
@@ -2462,12 +2506,6 @@ ISizeType::get_name () const
   return as_string ();
 }
 
-bool
-ISizeType::is_concrete () const
-{
-  return true;
-}
-
 void
 ISizeType::accept_vis (TyVisitor &vis)
 {
@@ -2521,12 +2559,6 @@ CharType::CharType (HirId ref, HirId ty_ref, std::set<HirId> refs)
 	      refs)
 {}
 
-bool
-CharType::is_concrete () const
-{
-  return true;
-}
-
 std::string
 CharType::get_name () const
 {
@@ -2590,12 +2622,6 @@ ReferenceType::ReferenceType (HirId ref, HirId ty_ref, TyVar base,
     base (base), mut (mut)
 {}
 
-bool
-ReferenceType::is_concrete () const
-{
-  return get_base ()->is_concrete ();
-}
-
 Mutability
 ReferenceType::mutability () const
 {
@@ -2743,12 +2769,6 @@ PointerType::PointerType (HirId ref, HirId ty_ref, TyVar base, Mutability mut,
     base (base), mut (mut)
 {}
 
-bool
-PointerType::is_concrete () const
-{
-  return get_base ()->is_concrete ();
-}
-
 Mutability
 PointerType::mutability () const
 {
@@ -2918,16 +2938,6 @@ ParamType::can_resolve () const
   return get_ref () != get_ty_ref ();
 }
 
-bool
-ParamType::is_concrete () const
-{
-  auto r = resolve ();
-  if (r == this)
-    return false;
-
-  return r->is_concrete ();
-}
-
 void
 ParamType::accept_vis (TyVisitor &vis)
 {
@@ -3097,12 +3107,6 @@ StrType::get_name () const
   return as_string ();
 }
 
-bool
-StrType::is_concrete () const
-{
-  return true;
-}
-
 BaseType *
 StrType::clone () const
 {
@@ -3174,12 +3178,6 @@ NeverType::is_unit () const
   return true;
 }
 
-bool
-NeverType::is_concrete () const
-{
-  return true;
-}
-
 void
 NeverType::accept_vis (TyVisitor &vis)
 {
@@ -3256,15 +3254,6 @@ PlaceholderType::get_symbol () const
   return symbol;
 }
 
-bool
-PlaceholderType::is_concrete () const
-{
-  if (!can_resolve ())
-    return true;
-
-  return resolve ()->is_concrete ();
-}
-
 void
 PlaceholderType::accept_vis (TyVisitor &vis)
 {
@@ -3423,12 +3412,6 @@ ProjectionType::get ()
   return base;
 }
 
-bool
-ProjectionType::is_concrete () const
-{
-  return base->is_concrete ();
-}
-
 void
 ProjectionType::accept_vis (TyVisitor &vis)
 {
@@ -3554,12 +3537,6 @@ DynamicObjectType::DynamicObjectType (
   : BaseType (ref, ty_ref, TypeKind::DYNAMIC, ident, specified_bounds, refs)
 {}
 
-bool
-DynamicObjectType::is_concrete () const
-{
-  return true;
-}
-
 void
 DynamicObjectType::accept_vis (TyVisitor &vis)
 {
diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h
index 7cd8673ea73..d49768eb53d 100644
--- a/gcc/rust/typecheck/rust-tyty.h
+++ b/gcc/rust/typecheck/rust-tyty.h
@@ -130,7 +130,7 @@ public:
 
   virtual bool is_unit () const;
 
-  virtual bool is_concrete () const = 0;
+  bool is_concrete () const;
 
   TypeKind get_kind () const;
 
@@ -223,8 +223,6 @@ public:
 
   bool default_type (BaseType **type) const;
 
-  bool is_concrete () const final override;
-
 private:
   InferTypeKind infer_kind;
 };
@@ -250,8 +248,6 @@ public:
   BaseType *monomorphized_clone () const final override;
 
   std::string get_name () const override final;
-
-  bool is_concrete () const final override;
 };
 
 class ParamType : public BaseType
@@ -289,8 +285,6 @@ public:
 
   bool is_equal (const BaseType &other) const override;
 
-  bool is_concrete () const override final;
-
   ParamType *handle_substitions (SubstitutionArgumentMappings &mappings);
 
   void set_implicit_self_trait ();
@@ -319,8 +313,6 @@ public:
   StructFieldType *clone () const;
   StructFieldType *monomorphized_clone () const;
 
-  bool is_concrete () const;
-
   void debug () const;
   Location get_locus () const;
   std::string as_string () const;
@@ -363,8 +355,6 @@ public:
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
-  bool is_concrete () const override final;
-
   const std::vector<TyVar> &get_fields () const;
 
   std::string get_name () const override final;
@@ -601,8 +591,6 @@ public:
     return identifier + subst_as_string ();
   }
 
-  bool is_concrete () const override final;
-
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
@@ -740,17 +728,6 @@ public:
     return param_at (0).second;
   }
 
-  bool is_concrete () const override final
-  {
-    for (const auto &param : params)
-      {
-	const BaseType *p = param.second;
-	if (!p->is_concrete ())
-	  return false;
-      }
-    return get_return_type ()->is_concrete ();
-  }
-
   std::vector<std::pair<HIR::Pattern *, BaseType *>> &get_params ()
   {
     return params;
@@ -839,28 +816,9 @@ public:
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
-  void iterate_params (std::function<bool (BaseType *)> cb) const
-  {
-    for (auto &p : params)
-      {
-	if (!cb (p.get_tyty ()))
-	  return;
-      }
-  }
-
   std::vector<TyVar> &get_params () { return params; }
   const std::vector<TyVar> &get_params () const { return params; }
 
-  bool is_concrete () const override final
-  {
-    for (auto &p : params)
-      {
-	if (!p.get_tyty ()->is_concrete ())
-	  return false;
-      }
-    return result_type.get_tyty ()->is_concrete ();
-  }
-
 private:
   std::vector<TyVar> params;
   TyVar result_type;
@@ -918,12 +876,6 @@ public:
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
-  bool is_concrete () const override final
-  {
-    return parameters->is_concrete ()
-	   && result_type.get_tyty ()->is_concrete ();
-  }
-
   bool needs_generic_substitutions () const override final
   {
     return needs_substitution ();
@@ -988,11 +940,6 @@ public:
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
-  bool is_concrete () const final override
-  {
-    return get_element_type ()->is_concrete ();
-  }
-
   HIR::Expr &get_capacity_expr () const { return capacity_expr; }
 
   ArrayType *handle_substitions (SubstitutionArgumentMappings &mappings);
@@ -1035,11 +982,6 @@ public:
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
-  bool is_concrete () const final override
-  {
-    return get_element_type ()->is_concrete ();
-  }
-
   SliceType *handle_substitions (SubstitutionArgumentMappings &mappings);
 
 private:
@@ -1063,7 +1005,6 @@ public:
 
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
-  bool is_concrete () const override final;
 };
 
 class IntType : public BaseType
@@ -1097,7 +1038,6 @@ public:
   BaseType *monomorphized_clone () const final override;
 
   bool is_equal (const BaseType &other) const override;
-  bool is_concrete () const override final;
 
 private:
   IntKind int_kind;
@@ -1135,7 +1075,6 @@ public:
   BaseType *monomorphized_clone () const final override;
 
   bool is_equal (const BaseType &other) const override;
-  bool is_concrete () const override final;
 
 private:
   UintKind uint_kind;
@@ -1169,7 +1108,6 @@ public:
   BaseType *monomorphized_clone () const final override;
 
   bool is_equal (const BaseType &other) const override;
-  bool is_concrete () const override final;
 
 private:
   FloatKind float_kind;
@@ -1192,7 +1130,6 @@ public:
 
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
-  bool is_concrete () const override final;
 };
 
 class ISizeType : public BaseType
@@ -1212,7 +1149,6 @@ public:
 
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
-  bool is_concrete () const override final;
 };
 
 class CharType : public BaseType
@@ -1231,7 +1167,6 @@ public:
 
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
-  bool is_concrete () const override final;
 };
 
 class StrType : public BaseType
@@ -1253,7 +1188,6 @@ public:
 
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
-  bool is_concrete () const override final;
 };
 
 class ReferenceType : public BaseType
@@ -1280,8 +1214,6 @@ public:
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
-  bool is_concrete () const override final;
-
   ReferenceType *handle_substitions (SubstitutionArgumentMappings &mappings);
 
   Mutability mutability () const;
@@ -1322,8 +1254,6 @@ public:
   BaseType *clone () const final override;
   BaseType *monomorphized_clone () const final override;
 
-  bool is_concrete () const override final;
-
   PointerType *handle_substitions (SubstitutionArgumentMappings &mappings);
 
   Mutability mutability () const;
@@ -1369,7 +1299,6 @@ public:
   std::string get_name () const override final;
 
   bool is_unit () const override;
-  bool is_concrete () const override final;
 };
 
 // used at the type in associated types in traits
@@ -1408,8 +1337,6 @@ public:
 
   bool is_equal (const BaseType &other) const override;
 
-  bool is_concrete () const override final;
-
 private:
   std::string symbol;
 };
@@ -1454,8 +1381,6 @@ public:
   const BaseType *get () const;
   BaseType *get ();
 
-  bool is_concrete () const override final;
-
   ProjectionType *
   handle_substitions (SubstitutionArgumentMappings &mappings) override final;
 
@@ -1490,8 +1415,6 @@ public:
 
   std::string get_name () const override final;
 
-  bool is_concrete () const override final;
-
   // this returns a flat list of items including super trait bounds
   const std::vector<
     std::pair<const Resolver::TraitItemReference *, const TypeBoundPredicate *>>

^ 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: refactor is_concrete to not just virtual dispatch 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).