public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-8037] gccrs: TyTy: TyTy improved subclass casting and checking
@ 2024-01-16 18:13 Arthur Cohen
  0 siblings, 0 replies; only message in thread
From: Arthur Cohen @ 2024-01-16 18:13 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:47b88c0338563537bbd77bed006abb383972339f

commit r14-8037-g47b88c0338563537bbd77bed006abb383972339f
Author: Jakub Dupak <dev@jakubdupak.com>
Date:   Tue Oct 3 16:14:39 2023 +0200

    gccrs: TyTy: TyTy improved subclass casting and checking
    
    Associate each subclass with its kind and create cast/match+cast
    methods.
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-tyty.cc (InferType::InferType): Use static constant for kind information.
            (ErrorType::ErrorType): Use static constant for kind information.
            (TupleType::TupleType): Use static constant for kind information.
            (BoolType::BoolType): Use static constant for kind information.
            (IntType::IntType): Use static constant for kind information.
            (UintType::UintType): Use static constant for kind information.
            (FloatType::FloatType): Use static constant for kind information.
            (USizeType::USizeType): Use static constant for kind information.
            (ISizeType::ISizeType): Use static constant for kind information.
            (CharType::CharType): Use static constant for kind information.
            (ReferenceType::ReferenceType): Use static constant for kind information.
            (PointerType::PointerType): Use static constant for kind information.
            (ParamType::ParamType): Use static constant for kind information.
            (StrType::StrType): Use static constant for kind information.
            (NeverType::NeverType): Use static constant for kind information.
            (PlaceholderType::PlaceholderType): Use static constant for kind information.
            * typecheck/rust-tyty.h: Add static kind information to all TyTy classes.
            Create safe cast and check methods.
    
    Signed-off-by: Jakub Dupak <dev@jakubdupak.com>

Diff:
---
 gcc/rust/typecheck/rust-tyty.cc |  76 +++++++++++++-------------
 gcc/rust/typecheck/rust-tyty.h  | 116 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 154 insertions(+), 38 deletions(-)

diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc
index 0a3ba85fff7..772ca4866f0 100644
--- a/gcc/rust/typecheck/rust-tyty.cc
+++ b/gcc/rust/typecheck/rust-tyty.cc
@@ -962,14 +962,14 @@ BaseType::needs_generic_substitutions () const
 
 InferType::InferType (HirId ref, InferTypeKind infer_kind, TypeHint hint,
 		      location_t locus, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::INFER,
-	      {Resolver::CanonicalPath::create_empty (), locus}, refs),
+  : BaseType (ref, ref, KIND, {Resolver::CanonicalPath::create_empty (), locus},
+	      refs),
     infer_kind (infer_kind), default_hint (hint)
 {}
 
 InferType::InferType (HirId ref, HirId ty_ref, InferTypeKind infer_kind,
 		      TypeHint hint, location_t locus, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::INFER,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), locus}, refs),
     infer_kind (infer_kind), default_hint (hint)
 {}
@@ -1274,12 +1274,12 @@ InferType::apply_primitive_type_hint (const BaseType &hint)
 // ErrorType
 
 ErrorType::ErrorType (HirId ref, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::ERROR,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), UNDEF_LOCATION}, refs)
 {}
 
 ErrorType::ErrorType (HirId ref, HirId ty_ref, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::ERROR,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), UNDEF_LOCATION}, refs)
 {}
 
@@ -1814,14 +1814,14 @@ ADTType::handle_substitions (SubstitutionArgumentMappings &subst_mappings)
 
 TupleType::TupleType (HirId ref, location_t locus, std::vector<TyVar> fields,
 		      std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::TUPLE,
-	      {Resolver::CanonicalPath::create_empty (), locus}, refs),
+  : BaseType (ref, ref, KIND, {Resolver::CanonicalPath::create_empty (), locus},
+	      refs),
     fields (fields)
 {}
 
 TupleType::TupleType (HirId ref, HirId ty_ref, location_t locus,
 		      std::vector<TyVar> fields, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::TUPLE,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), locus}, refs),
     fields (fields)
 {}
@@ -2487,13 +2487,13 @@ SliceType::handle_substitions (SubstitutionArgumentMappings &mappings)
 // BoolType
 
 BoolType::BoolType (HirId ref, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::BOOL,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
 
 BoolType::BoolType (HirId ref, HirId ty_ref, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::BOOL,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
@@ -2538,14 +2538,14 @@ BoolType::clone () const
 // IntType
 
 IntType::IntType (HirId ref, IntKind kind, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::INT,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     int_kind (kind)
 {}
 
 IntType::IntType (HirId ref, HirId ty_ref, IntKind kind, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::INT,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     int_kind (kind)
@@ -2622,7 +2622,7 @@ IntType::is_equal (const BaseType &other) const
 // UintType
 
 UintType::UintType (HirId ref, UintKind kind, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::UINT,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     uint_kind (kind)
@@ -2630,7 +2630,7 @@ UintType::UintType (HirId ref, UintKind kind, std::set<HirId> refs)
 
 UintType::UintType (HirId ref, HirId ty_ref, UintKind kind,
 		    std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::UINT,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     uint_kind (kind)
@@ -2707,7 +2707,7 @@ UintType::is_equal (const BaseType &other) const
 // FloatType
 
 FloatType::FloatType (HirId ref, FloatKind kind, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::FLOAT,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     float_kind (kind)
@@ -2715,7 +2715,7 @@ FloatType::FloatType (HirId ref, FloatKind kind, std::set<HirId> refs)
 
 FloatType::FloatType (HirId ref, HirId ty_ref, FloatKind kind,
 		      std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::FLOAT,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     float_kind (kind)
@@ -2786,13 +2786,13 @@ FloatType::is_equal (const BaseType &other) const
 // UsizeType
 
 USizeType::USizeType (HirId ref, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::USIZE,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
 
 USizeType::USizeType (HirId ref, HirId ty_ref, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::USIZE,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
@@ -2837,13 +2837,13 @@ USizeType::clone () const
 // ISizeType
 
 ISizeType::ISizeType (HirId ref, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::ISIZE,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
 
 ISizeType::ISizeType (HirId ref, HirId ty_ref, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::ISIZE,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
@@ -2888,13 +2888,13 @@ ISizeType::clone () const
 // Char Type
 
 CharType::CharType (HirId ref, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::CHAR,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
 
 CharType::CharType (HirId ref, HirId ty_ref, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::CHAR,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
@@ -2940,7 +2940,7 @@ CharType::clone () const
 
 ReferenceType::ReferenceType (HirId ref, TyVar base, Mutability mut,
 			      std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::REF,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     base (base), mut (mut)
@@ -2948,7 +2948,7 @@ ReferenceType::ReferenceType (HirId ref, TyVar base, Mutability mut,
 
 ReferenceType::ReferenceType (HirId ref, HirId ty_ref, TyVar base,
 			      Mutability mut, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::REF,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     base (base), mut (mut)
@@ -3096,7 +3096,7 @@ ReferenceType::handle_substitions (SubstitutionArgumentMappings &mappings)
 
 PointerType::PointerType (HirId ref, TyVar base, Mutability mut,
 			  std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::POINTER,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     base (base), mut (mut)
@@ -3104,7 +3104,7 @@ PointerType::PointerType (HirId ref, TyVar base, Mutability mut,
 
 PointerType::PointerType (HirId ref, HirId ty_ref, TyVar base, Mutability mut,
 			  std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::POINTER,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     base (base), mut (mut)
@@ -3260,7 +3260,7 @@ ParamType::ParamType (std::string symbol, location_t locus, HirId ref,
 		      HIR::GenericParam &param,
 		      std::vector<TypeBoundPredicate> specified_bounds,
 		      std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::PARAM,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::new_seg (UNKNOWN_NODEID, symbol),
 	       locus},
 	      specified_bounds, refs),
@@ -3271,7 +3271,7 @@ ParamType::ParamType (bool is_trait_self, std::string symbol, location_t locus,
 		      HirId ref, HirId ty_ref, HIR::GenericParam &param,
 		      std::vector<TypeBoundPredicate> specified_bounds,
 		      std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::PARAM,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::new_seg (UNKNOWN_NODEID, symbol),
 	       locus},
 	      specified_bounds, refs),
@@ -3434,13 +3434,13 @@ ParamType::is_implicit_self_trait () const
 // StrType
 
 StrType::StrType (HirId ref, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::STR,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
 
 StrType::StrType (HirId ref, HirId ty_ref, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::STR,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
@@ -3491,13 +3491,13 @@ StrType::is_equal (const BaseType &other) const
 // Never Type
 
 NeverType::NeverType (HirId ref, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::NEVER,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
 
 NeverType::NeverType (HirId ref, HirId ty_ref, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::NEVER,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs)
 {}
@@ -3543,7 +3543,7 @@ NeverType::clone () const
 
 PlaceholderType::PlaceholderType (std::string symbol, HirId ref,
 				  std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::PLACEHOLDER,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     symbol (symbol)
@@ -3551,7 +3551,7 @@ PlaceholderType::PlaceholderType (std::string symbol, HirId ref,
 
 PlaceholderType::PlaceholderType (std::string symbol, HirId ref, HirId ty_ref,
 				  std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::PLACEHOLDER,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     symbol (symbol)
@@ -3656,7 +3656,7 @@ ProjectionType::ProjectionType (
   HirId ref, BaseType *base, const Resolver::TraitReference *trait, DefId item,
   std::vector<SubstitutionParamMapping> subst_refs,
   SubstitutionArgumentMappings generic_arguments, std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::PROJECTION,
+  : BaseType (ref, ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     SubstitutionRef (std::move (subst_refs), std::move (generic_arguments)),
@@ -3668,7 +3668,7 @@ ProjectionType::ProjectionType (
   const Resolver::TraitReference *trait, DefId item,
   std::vector<SubstitutionParamMapping> subst_refs,
   SubstitutionArgumentMappings generic_arguments, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::PROJECTION,
+  : BaseType (ref, ty_ref, KIND,
 	      {Resolver::CanonicalPath::create_empty (), BUILTINS_LOCATION},
 	      refs),
     SubstitutionRef (std::move (subst_refs), std::move (generic_arguments)),
@@ -3802,13 +3802,13 @@ ProjectionType::handle_substitions (
 DynamicObjectType::DynamicObjectType (
   HirId ref, RustIdent ident, std::vector<TypeBoundPredicate> specified_bounds,
   std::set<HirId> refs)
-  : BaseType (ref, ref, TypeKind::DYNAMIC, ident, specified_bounds, refs)
+  : BaseType (ref, ref, KIND, ident, specified_bounds, refs)
 {}
 
 DynamicObjectType::DynamicObjectType (
   HirId ref, HirId ty_ref, RustIdent ident,
   std::vector<TypeBoundPredicate> specified_bounds, std::set<HirId> refs)
-  : BaseType (ref, ty_ref, TypeKind::DYNAMIC, ident, specified_bounds, refs)
+  : BaseType (ref, ty_ref, KIND, ident, specified_bounds, refs)
 {}
 
 void
diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h
index 3ba24de10d9..0858502c6cb 100644
--- a/gcc/rust/typecheck/rust-tyty.h
+++ b/gcc/rust/typecheck/rust-tyty.h
@@ -31,7 +31,9 @@ namespace Rust {
 
 namespace Resolver {
 class TraitReference;
+
 class TraitItemReference;
+
 class AssociatedImplTrait;
 } // namespace Resolver
 
@@ -116,9 +118,12 @@ public:
 
   bool satisfies_bound (const TypeBoundPredicate &predicate,
 			bool emit_error) const;
+
   bool bounds_compatible (const BaseType &other, location_t locus,
 			  bool emit_error) const;
+
   void inherit_bounds (const BaseType &other);
+
   void inherit_bounds (
     const std::vector<TyTy::TypeBoundPredicate> &specified_bounds);
 
@@ -138,10 +143,13 @@ public:
 
   // get_combined_refs returns the chain of node refs involved in unification
   std::set<HirId> get_combined_refs () const;
+
   void append_reference (HirId id);
 
   std::string mappings_str () const;
+
   std::string debug_str () const;
+
   void debug () const;
 
   // FIXME this will eventually go away
@@ -168,6 +176,55 @@ public:
    * releasing the memory of the returned ty. */
   virtual BaseType *clone () const = 0;
 
+  // Check if TyTy::BaseType is of a specific type.
+  template <typename T>[[nodiscard]] bool is () const
+  {
+    static_assert (std::is_base_of<BaseType, T>::value,
+		   "Can only safely cast to TyTy types.");
+    return this->get_kind () == T::KIND;
+  }
+
+  template <typename T> T *as () const
+  {
+    static_assert (std::is_base_of<BaseType, T>::value,
+		   "Can only safely cast to TyTy types.");
+    rust_assert (this->is<T> ());
+    return static_cast<T *> (this);
+  }
+
+  template <typename T> T *as ()
+  {
+    static_assert (std::is_base_of<BaseType, T>::value,
+		   "Can only safely cast to TyTy types.");
+    rust_assert (this->is<T> ());
+    return static_cast<T *> (this);
+  }
+
+  // Check if TyTy::BaseType is of a specific type and convert it to that type
+  // if so.
+  // Returns nullptr otherwise. Works as a dynamic_cast, but without compiler
+  // RTTI.
+  template <typename T> T *try_as () const
+  {
+    static_assert (std::is_base_of<BaseType, T>::value,
+		   "Can only safely cast to TyTy types.");
+    if (!this->is<T> ())
+      return nullptr;
+
+    return static_cast<T *> (this);
+  }
+
+  // See above.
+  template <typename T> T *try_as ()
+  {
+    static_assert (std::is_base_of<BaseType, T>::value,
+		   "Can only safely cast to TyTy types.");
+    if (!this->is<T> ())
+      return nullptr;
+
+    return static_cast<T *> (this);
+  }
+
 protected:
   BaseType (HirId ref, HirId ty_ref, TypeKind kind, RustIdent ident,
 	    std::set<HirId> refs = std::set<HirId> ());
@@ -188,6 +245,8 @@ protected:
 class InferType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::INFER;
+
   enum InferTypeKind
   {
     GENERAL,
@@ -231,6 +290,7 @@ public:
 	     location_t locus, std::set<HirId> refs = std::set<HirId> ());
 
   void accept_vis (TyVisitor &vis) override;
+
   void accept_vis (TyConstVisitor &vis) const override;
 
   std::string as_string () const override;
@@ -255,6 +315,8 @@ private:
 class ErrorType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::ERROR;
+
   ErrorType (HirId ref, std::set<HirId> refs = std::set<HirId> ());
 
   ErrorType (HirId ref, HirId ty_ref,
@@ -275,6 +337,8 @@ public:
 class ParamType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::PARAM;
+
   ParamType (std::string symbol, location_t locus, HirId ref,
 	     HIR::GenericParam &param,
 	     std::vector<TypeBoundPredicate> specified_bounds,
@@ -348,6 +412,8 @@ private:
 class TupleType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::TUPLE;
+
   TupleType (HirId ref, location_t locus,
 	     std::vector<TyVar> fields = std::vector<TyVar> (),
 	     std::set<HirId> refs = std::set<HirId> ());
@@ -511,7 +577,9 @@ public:
   std::string as_string () const;
 
   bool is_equal (const VariantDef &other) const;
+
   VariantDef *clone () const;
+
   VariantDef *monomorphized_clone () const;
 
   const RustIdent &get_ident () const;
@@ -530,6 +598,8 @@ private:
 class ADTType : public BaseType, public SubstitutionRef
 {
 public:
+  static constexpr auto KIND = TypeKind::ADT;
+
   enum ADTKind
   {
     STRUCT_STRUCT,
@@ -587,14 +657,19 @@ public:
   {}
 
   ADTKind get_adt_kind () const { return adt_kind; }
+
   ReprOptions get_repr_options () const { return repr; }
 
   bool is_struct_struct () const { return adt_kind == STRUCT_STRUCT; }
+
   bool is_tuple_struct () const { return adt_kind == TUPLE_STRUCT; }
+
   bool is_union () const { return adt_kind == UNION; }
+
   bool is_enum () const { return adt_kind == ENUM; }
 
   void accept_vis (TyVisitor &vis) override;
+
   void accept_vis (TyConstVisitor &vis) const override;
 
   std::string as_string () const override;
@@ -615,6 +690,7 @@ public:
   size_t number_of_variants () const { return variants.size (); }
 
   std::vector<VariantDef *> &get_variants () { return variants; }
+
   const std::vector<VariantDef *> &get_variants () const { return variants; }
 
   bool lookup_variant (const std::string &lookup,
@@ -663,6 +739,8 @@ private:
 class FnType : public BaseType, public SubstitutionRef
 {
 public:
+  static constexpr auto KIND = TypeKind::FNDEF;
+
   static const uint8_t FNTYPE_DEFAULT_FLAGS = 0x00;
   static const uint8_t FNTYPE_IS_METHOD_FLAG = 0x01;
   static const uint8_t FNTYPE_IS_EXTERN_FLAG = 0x02;
@@ -776,6 +854,8 @@ private:
 class FnPtr : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::FNPTR;
+
   FnPtr (HirId ref, location_t locus, std::vector<TyVar> params,
 	 TyVar result_type, std::set<HirId> refs = std::set<HirId> ())
     : BaseType (ref, ref, TypeKind::FNPTR,
@@ -821,6 +901,8 @@ private:
 class ClosureType : public BaseType, public SubstitutionRef
 {
 public:
+  static constexpr auto KIND = TypeKind::CLOSURE;
+
   ClosureType (HirId ref, DefId id, RustIdent ident,
 	       TyTy::TupleType *parameters, TyVar result_type,
 	       std::vector<SubstitutionParamMapping> subst_refs,
@@ -891,6 +973,8 @@ private:
 class ArrayType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::ARRAY;
+
   ArrayType (HirId ref, location_t locus, HIR::Expr &capacity_expr, TyVar base,
 	     std::set<HirId> refs = std::set<HirId> ())
     : BaseType (ref, ref, TypeKind::ARRAY,
@@ -934,6 +1018,8 @@ private:
 class SliceType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::SLICE;
+
   SliceType (HirId ref, location_t locus, TyVar base,
 	     std::set<HirId> refs = std::set<HirId> ())
     : BaseType (ref, ref, TypeKind::SLICE,
@@ -973,6 +1059,8 @@ private:
 class BoolType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::BOOL;
+
   BoolType (HirId ref, std::set<HirId> refs = std::set<HirId> ());
   BoolType (HirId ref, HirId ty_ref, std::set<HirId> refs = std::set<HirId> ());
 
@@ -1000,6 +1088,8 @@ public:
     I128
   };
 
+  static constexpr auto KIND = TypeKind::INT;
+
   IntType (HirId ref, IntKind kind, std::set<HirId> refs = std::set<HirId> ());
   IntType (HirId ref, HirId ty_ref, IntKind kind,
 	   std::set<HirId> refs = std::set<HirId> ());
@@ -1026,6 +1116,8 @@ private:
 class UintType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::UINT;
+
   enum UintKind
   {
     U8,
@@ -1062,6 +1154,8 @@ private:
 class FloatType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::FLOAT;
+
   enum FloatKind
   {
     F32,
@@ -1094,6 +1188,8 @@ private:
 class USizeType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::USIZE;
+
   USizeType (HirId ref, std::set<HirId> refs = std::set<HirId> ());
   USizeType (HirId ref, HirId ty_ref,
 	     std::set<HirId> refs = std::set<HirId> ());
@@ -1112,6 +1208,8 @@ public:
 class ISizeType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::ISIZE;
+
   ISizeType (HirId ref, std::set<HirId> refs = std::set<HirId> ());
   ISizeType (HirId ref, HirId ty_ref,
 	     std::set<HirId> refs = std::set<HirId> ());
@@ -1130,6 +1228,8 @@ public:
 class CharType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::CHAR;
+
   CharType (HirId ref, std::set<HirId> refs = std::set<HirId> ());
   CharType (HirId ref, HirId ty_ref, std::set<HirId> refs = std::set<HirId> ());
 
@@ -1147,6 +1247,8 @@ public:
 class StrType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::STR;
+
   StrType (HirId ref, std::set<HirId> refs = std::set<HirId> ());
   StrType (HirId ref, HirId ty_ref, std::set<HirId> refs = std::set<HirId> ());
 
@@ -1167,6 +1269,8 @@ public:
 class DynamicObjectType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::DYNAMIC;
+
   DynamicObjectType (HirId ref, RustIdent ident,
 		     std::vector<TypeBoundPredicate> specified_bounds,
 		     std::set<HirId> refs = std::set<HirId> ());
@@ -1197,6 +1301,8 @@ public:
 class ReferenceType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::REF;
+
   ReferenceType (HirId ref, TyVar base, Mutability mut,
 		 std::set<HirId> refs = std::set<HirId> ());
   ReferenceType (HirId ref, HirId ty_ref, TyVar base, Mutability mut,
@@ -1236,6 +1342,8 @@ private:
 class PointerType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::POINTER;
+
   PointerType (HirId ref, TyVar base, Mutability mut,
 	       std::set<HirId> refs = std::set<HirId> ());
   PointerType (HirId ref, HirId ty_ref, TyVar base, Mutability mut,
@@ -1284,11 +1392,15 @@ private:
 class NeverType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::NEVER;
+
   NeverType (HirId ref, std::set<HirId> refs = std::set<HirId> ());
+
   NeverType (HirId ref, HirId ty_ref,
 	     std::set<HirId> refs = std::set<HirId> ());
 
   void accept_vis (TyVisitor &vis) override;
+
   void accept_vis (TyConstVisitor &vis) const override;
 
   std::string as_string () const override;
@@ -1305,6 +1417,8 @@ public:
 class PlaceholderType : public BaseType
 {
 public:
+  static constexpr auto KIND = TypeKind::PLACEHOLDER;
+
   PlaceholderType (std::string symbol, HirId ref,
 		   std::set<HirId> refs = std::set<HirId> ());
   PlaceholderType (std::string symbol, HirId ref, HirId ty_ref,
@@ -1340,6 +1454,8 @@ private:
 class ProjectionType : public BaseType, public SubstitutionRef
 {
 public:
+  static constexpr auto KIND = TypeKind::PROJECTION;
+
   ProjectionType (HirId ref, BaseType *base,
 		  const Resolver::TraitReference *trait, DefId item,
 		  std::vector<SubstitutionParamMapping> subst_refs,

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

only message in thread, other threads:[~2024-01-16 18:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-16 18:13 [gcc r14-8037] gccrs: TyTy: TyTy improved subclass casting and checking Arthur Cohen

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).