diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-03-10 16:31:14 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-17 10:34:36 +0000 |
commit | d6e39f781eec041aad061b1cee35c99e2ad37868 (patch) | |
tree | cba740890b9b4239632657eb8e70c83db935d11c | |
parent | 712aa0027c6fa6ea06560f0a797208bab19fbb24 (diff) | |
download | gcc-d6e39f781eec041aad061b1cee35c99e2ad37868.zip gcc-d6e39f781eec041aad061b1cee35c99e2ad37868.tar.gz gcc-d6e39f781eec041aad061b1cee35c99e2ad37868.tar.bz2 |
gccrs: refactor monomoprhized_clone to not use virtual dispatch
gcc/rust/ChangeLog:
* typecheck/rust-tyty.cc (BaseType::monomorphized_clone): new impl
(InferType::monomorphized_clone): remove
(ErrorType::monomorphized_clone): likewise
(ADTType::monomorphized_clone): likewise
(TupleType::monomorphized_clone): likewise
(FnType::monomorphized_clone): likewise
(FnPtr::monomorphized_clone): likewise
(ClosureType::monomorphized_clone): likewise
(ArrayType::clone): likewise
(ArrayType::get_var_element_type): likewise
(ArrayType::monomorphized_clone): likewise
(SliceType::clone): likewise
(SliceType::get_var_element_type): likewise
(SliceType::monomorphized_clone): likewise
(BoolType::monomorphized_clone): likewise
(IntType::monomorphized_clone): likewise
(UintType::monomorphized_clone): likewise
(FloatType::monomorphized_clone): likewise
(USizeType::monomorphized_clone): likewise
(ISizeType::monomorphized_clone): likewise
(CharType::monomorphized_clone): likewise
(ReferenceType::clone): likewise
(ReferenceType::get_var_element_type): likewise
(ReferenceType::monomorphized_clone): likewise
(PointerType::clone): likewise
(PointerType::get_var_element_type): likewise
(PointerType::monomorphized_clone): likewise
(ParamType::monomorphized_clone): likewise
(StrType::monomorphized_clone): likewise
(NeverType::monomorphized_clone): likewise
(PlaceholderType::monomorphized_clone): likewise
(ProjectionType::monomorphized_clone): likewise
(DynamicObjectType::monomorphized_clone): likewise
* typecheck/rust-tyty.h: update header
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.cc | 314 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.h | 39 |
2 files changed, 145 insertions, 208 deletions
diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc index dbd4b5c..90d227c 100644 --- a/gcc/rust/typecheck/rust-tyty.cc +++ b/gcc/rust/typecheck/rust-tyty.cc @@ -25,10 +25,8 @@ #include "rust-substitution-mapper.h" #include "rust-hir-trait-reference.h" -#include "rust-hir-type-bounds.h" #include "rust-hir-trait-resolve.h" #include "rust-tyty-cmp.h" -#include "rust-type-util.h" #include "options.h" @@ -572,6 +570,122 @@ BaseType::destructure () const return x; } +BaseType * +BaseType::monomorphized_clone () const +{ + const TyTy::BaseType *x = destructure (); + switch (x->get_kind ()) + { + case PARAM: + case PROJECTION: + case PLACEHOLDER: + case INFER: + case BOOL: + case CHAR: + case INT: + case UINT: + case FLOAT: + case USIZE: + case ISIZE: + case NEVER: + case STR: + case DYNAMIC: + case CLOSURE: + case ERROR: + return x->clone (); + + case ARRAY: { + const ArrayType &arr = *static_cast<const ArrayType *> (x); + TyVar elm = arr.get_var_element_type ().monomorphized_clone (); + return new ArrayType (arr.get_ref (), arr.get_ty_ref (), ident.locus, + arr.get_capacity_expr (), elm, + arr.get_combined_refs ()); + } + break; + + case SLICE: { + const SliceType &slice = *static_cast<const SliceType *> (x); + TyVar elm = slice.get_var_element_type ().monomorphized_clone (); + return new SliceType (slice.get_ref (), slice.get_ty_ref (), + ident.locus, elm, slice.get_combined_refs ()); + } + break; + + case POINTER: { + const PointerType &ptr = *static_cast<const PointerType *> (x); + TyVar elm = ptr.get_var_element_type ().monomorphized_clone (); + return new PointerType (ptr.get_ref (), ptr.get_ty_ref (), elm, + ptr.mutability (), ptr.get_combined_refs ()); + } + break; + + case REF: { + const ReferenceType &ref = *static_cast<const ReferenceType *> (x); + TyVar elm = ref.get_var_element_type ().monomorphized_clone (); + return new ReferenceType (ref.get_ref (), ref.get_ty_ref (), elm, + ref.mutability (), ref.get_combined_refs ()); + } + break; + + case TUPLE: { + const TupleType &tuple = *static_cast<const TupleType *> (x); + std::vector<TyVar> cloned_fields; + for (const auto &f : tuple.get_fields ()) + cloned_fields.push_back (f.monomorphized_clone ()); + + return new TupleType (tuple.get_ref (), tuple.get_ty_ref (), + tuple.get_ident ().locus, cloned_fields, + tuple.get_combined_refs ()); + } + break; + + case FNDEF: { + const FnType &fn = *static_cast<const FnType *> (x); + std::vector<std::pair<HIR::Pattern *, BaseType *>> cloned_params; + for (auto &p : fn.get_params ()) + cloned_params.push_back ({p.first, p.second->monomorphized_clone ()}); + + BaseType *retty = fn.get_return_type ()->monomorphized_clone (); + return new FnType (fn.get_ref (), fn.get_ty_ref (), fn.get_id (), + fn.get_identifier (), fn.ident, fn.get_flags (), + fn.get_abi (), std::move (cloned_params), retty, + fn.clone_substs (), fn.get_combined_refs ()); + } + break; + + case FNPTR: { + const FnPtr &fn = *static_cast<const FnPtr *> (x); + std::vector<TyVar> cloned_params; + for (auto &p : fn.get_params ()) + cloned_params.push_back (p.monomorphized_clone ()); + + TyVar retty = fn.get_var_return_type ().monomorphized_clone (); + return new FnPtr (fn.get_ref (), fn.get_ty_ref (), fn.ident.locus, + std::move (cloned_params), retty, + fn.get_combined_refs ()); + } + break; + + case ADT: { + const ADTType &adt = *static_cast<const ADTType *> (x); + std::vector<VariantDef *> cloned_variants; + for (auto &variant : adt.get_variants ()) + cloned_variants.push_back (variant->monomorphized_clone ()); + + return new ADTType (adt.get_ref (), adt.get_ty_ref (), + adt.get_identifier (), adt.ident, + adt.get_adt_kind (), cloned_variants, + adt.clone_substs (), adt.get_repr_options (), + adt.get_used_arguments (), + adt.get_combined_refs ()); + } + break; + } + + gcc_unreachable (); + return nullptr; +} + std::string BaseType::mappings_str () const { @@ -820,12 +934,6 @@ InferType::clone () const return clone; } -BaseType * -InferType::monomorphized_clone () const -{ - return clone (); -} - bool InferType::default_type (BaseType **type) const { @@ -899,12 +1007,6 @@ ErrorType::clone () const return new ErrorType (get_ref (), get_ty_ref (), get_combined_refs ()); } -BaseType * -ErrorType::monomorphized_clone () const -{ - return clone (); -} - // Struct Field type StructFieldType::StructFieldType (HirId ref, std::string name, BaseType *ty, @@ -1314,19 +1416,6 @@ ADTType::clone () const get_combined_refs ()); } -BaseType * -ADTType::monomorphized_clone () const -{ - std::vector<VariantDef *> cloned_variants; - for (auto &variant : variants) - cloned_variants.push_back (variant->monomorphized_clone ()); - - return new ADTType (get_ref (), get_ty_ref (), identifier, ident, - get_adt_kind (), cloned_variants, clone_substs (), - get_repr_options (), used_arguments, - get_combined_refs ()); -} - static bool handle_substitions (SubstitutionArgumentMappings &subst_mappings, StructFieldType *field) @@ -1528,17 +1617,6 @@ TupleType::clone () const cloned_fields, get_combined_refs ()); } -BaseType * -TupleType::monomorphized_clone () const -{ - std::vector<TyVar> cloned_fields; - for (const auto &f : fields) - cloned_fields.push_back (f.monomorphized_clone ()); - - return new TupleType (get_ref (), get_ty_ref (), get_ident ().locus, - cloned_fields, get_combined_refs ()); -} - TupleType * TupleType::handle_substitions (SubstitutionArgumentMappings &mappings) { @@ -1660,19 +1738,6 @@ FnType::clone () const get_combined_refs ()); } -BaseType * -FnType::monomorphized_clone () const -{ - std::vector<std::pair<HIR::Pattern *, BaseType *>> cloned_params; - for (auto &p : params) - cloned_params.push_back ({p.first, p.second->monomorphized_clone ()}); - - return new FnType (get_ref (), get_ty_ref (), get_id (), get_identifier (), - ident, flags, abi, std::move (cloned_params), - get_return_type ()->clone (), clone_substs (), - get_combined_refs ()); -} - FnType * FnType::handle_substitions (SubstitutionArgumentMappings &subst_mappings) { @@ -1858,18 +1923,6 @@ FnPtr::clone () const get_combined_refs ()); } -BaseType * -FnPtr::monomorphized_clone () const -{ - std::vector<TyVar> cloned_params; - for (auto &p : params) - cloned_params.push_back (p.monomorphized_clone ()); - - return new FnPtr (get_ref (), get_ty_ref (), ident.locus, - std::move (cloned_params), result_type, - get_combined_refs ()); -} - void ClosureType::accept_vis (TyVisitor &vis) { @@ -1921,12 +1974,6 @@ ClosureType::clone () const specified_bounds); } -BaseType * -ClosureType::monomorphized_clone () const -{ - return clone (); -} - ClosureType * ClosureType::handle_substitions (SubstitutionArgumentMappings &mappings) { @@ -2025,19 +2072,17 @@ ArrayType::get_element_type () const return element_type.get_tyty (); } -BaseType * -ArrayType::clone () const +const TyVar & +ArrayType::get_var_element_type () const { - return new ArrayType (get_ref (), get_ty_ref (), ident.locus, capacity_expr, - element_type, get_combined_refs ()); + return element_type; } BaseType * -ArrayType::monomorphized_clone () const +ArrayType::clone () const { return new ArrayType (get_ref (), get_ty_ref (), ident.locus, capacity_expr, - element_type.monomorphized_clone (), - get_combined_refs ()); + element_type, get_combined_refs ()); } ArrayType * @@ -2101,19 +2146,17 @@ SliceType::get_element_type () const return element_type.get_tyty (); } -BaseType * -SliceType::clone () const +const TyVar & +SliceType::get_var_element_type () const { - return new SliceType (get_ref (), get_ty_ref (), ident.locus, - element_type.clone (), get_combined_refs ()); + return element_type; } BaseType * -SliceType::monomorphized_clone () const +SliceType::clone () const { return new SliceType (get_ref (), get_ty_ref (), ident.locus, - element_type.monomorphized_clone (), - get_combined_refs ()); + element_type.clone (), get_combined_refs ()); } SliceType * @@ -2185,12 +2228,6 @@ BoolType::clone () const return new BoolType (get_ref (), get_ty_ref (), get_combined_refs ()); } -BaseType * -BoolType::monomorphized_clone () const -{ - return clone (); -} - // IntType IntType::IntType (HirId ref, IntKind kind, std::set<HirId> refs) @@ -2267,12 +2304,6 @@ IntType::clone () const get_combined_refs ()); } -BaseType * -IntType::monomorphized_clone () const -{ - return clone (); -} - bool IntType::is_equal (const BaseType &other) const { @@ -2360,12 +2391,6 @@ UintType::clone () const get_combined_refs ()); } -BaseType * -UintType::monomorphized_clone () const -{ - return clone (); -} - bool UintType::is_equal (const BaseType &other) const { @@ -2447,12 +2472,6 @@ FloatType::clone () const get_combined_refs ()); } -BaseType * -FloatType::monomorphized_clone () const -{ - return clone (); -} - bool FloatType::is_equal (const BaseType &other) const { @@ -2516,12 +2535,6 @@ USizeType::clone () const return new USizeType (get_ref (), get_ty_ref (), get_combined_refs ()); } -BaseType * -USizeType::monomorphized_clone () const -{ - return clone (); -} - // ISizeType ISizeType::ISizeType (HirId ref, std::set<HirId> refs) @@ -2575,12 +2588,6 @@ ISizeType::clone () const return new ISizeType (get_ref (), get_ty_ref (), get_combined_refs ()); } -BaseType * -ISizeType::monomorphized_clone () const -{ - return clone (); -} - // Char Type CharType::CharType (HirId ref, std::set<HirId> refs) @@ -2634,12 +2641,6 @@ CharType::clone () const return new CharType (get_ref (), get_ty_ref (), get_combined_refs ()); } -BaseType * -CharType::monomorphized_clone () const -{ - return clone (); -} - // Reference Type ReferenceType::ReferenceType (HirId ref, TyVar base, Mutability mut, @@ -2756,18 +2757,16 @@ ReferenceType::get_base () const return base.get_tyty (); } -BaseType * -ReferenceType::clone () const +const TyVar & +ReferenceType::get_var_element_type () const { - return new ReferenceType (get_ref (), get_ty_ref (), base, mutability (), - get_combined_refs ()); + return base; } BaseType * -ReferenceType::monomorphized_clone () const +ReferenceType::clone () const { - return new ReferenceType (get_ref (), get_ty_ref (), - base.monomorphized_clone (), mutability (), + return new ReferenceType (get_ref (), get_ty_ref (), base, mutability (), get_combined_refs ()); } @@ -2909,18 +2908,16 @@ PointerType::get_base () const return base.get_tyty (); } -BaseType * -PointerType::clone () const +const TyVar & +PointerType::get_var_element_type () const { - return new PointerType (get_ref (), get_ty_ref (), base, mutability (), - get_combined_refs ()); + return base; } BaseType * -PointerType::monomorphized_clone () const +PointerType::clone () const { - return new PointerType (get_ref (), get_ty_ref (), - base.monomorphized_clone (), mutability (), + return new PointerType (get_ref (), get_ty_ref (), base, mutability (), get_combined_refs ()); } @@ -3024,12 +3021,6 @@ ParamType::clone () const get_combined_refs ()); } -BaseType * -ParamType::monomorphized_clone () const -{ - return resolve ()->clone (); -} - std::string ParamType::get_symbol () const { @@ -3151,12 +3142,6 @@ StrType::clone () const return new StrType (get_ref (), get_ty_ref (), get_combined_refs ()); } -BaseType * -StrType::monomorphized_clone () const -{ - return clone (); -} - void StrType::accept_vis (TyVisitor &vis) { @@ -3241,12 +3226,6 @@ NeverType::clone () const return new NeverType (get_ref (), get_ty_ref (), get_combined_refs ()); } -BaseType * -NeverType::monomorphized_clone () const -{ - return clone (); -} - // placeholder type PlaceholderType::PlaceholderType (std::string symbol, HirId ref, @@ -3312,15 +3291,6 @@ PlaceholderType::clone () const get_combined_refs ()); } -BaseType * -PlaceholderType::monomorphized_clone () const -{ - if (can_resolve ()) - return resolve ()->monomorphized_clone (); - - return clone (); -} - void PlaceholderType::set_associated_type (HirId ref) { @@ -3463,12 +3433,6 @@ ProjectionType::clone () const get_combined_refs ()); } -BaseType * -ProjectionType::monomorphized_clone () const -{ - return get ()->monomorphized_clone (); -} - ProjectionType * ProjectionType::handle_substitions ( SubstitutionArgumentMappings &subst_mappings) @@ -3588,12 +3552,6 @@ DynamicObjectType::clone () const specified_bounds, get_combined_refs ()); } -BaseType * -DynamicObjectType::monomorphized_clone () const -{ - return clone (); -} - std::string DynamicObjectType::get_name () const { diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h index 47f5516..ce17c18 100644 --- a/gcc/rust/typecheck/rust-tyty.h +++ b/gcc/rust/typecheck/rust-tyty.h @@ -135,8 +135,9 @@ public: * releasing the memory of the returned ty. */ virtual BaseType *clone () const = 0; - // TODO - virtual BaseType *monomorphized_clone () const = 0; + // monomorphized clone is a clone which destructures the types to get rid of + // generics + BaseType *monomorphized_clone () const; // get_combined_refs returns the chain of node refs involved in unification std::set<HirId> get_combined_refs () const; @@ -212,7 +213,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; InferTypeKind get_infer_kind () const; @@ -240,7 +240,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; std::string get_name () const override final; }; @@ -266,7 +265,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; std::string get_symbol () const; @@ -346,7 +344,6 @@ public: BaseType *get_field (size_t index) const; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; const std::vector<TyVar> &get_fields () const; @@ -574,7 +571,6 @@ public: } BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; bool needs_generic_substitutions () const override final { @@ -733,7 +729,6 @@ public: BaseType *get_return_type () const { return type; } BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; bool needs_generic_substitutions () const override final { @@ -751,6 +746,7 @@ public: handle_substitions (SubstitutionArgumentMappings &mappings) override final; ABI get_abi () const { return abi; } + uint8_t get_flags () const { return flags; } private: std::vector<std::pair<HIR::Pattern *, BaseType *>> params; @@ -781,6 +777,7 @@ public: std::string get_name () const override final { return as_string (); } BaseType *get_return_type () const { return result_type.get_tyty (); } + const TyVar &get_var_return_type () const { return result_type; } size_t num_params () const { return params.size (); } @@ -796,7 +793,6 @@ public: bool is_equal (const BaseType &other) const override; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; std::vector<TyVar> &get_params () { return params; } const std::vector<TyVar> &get_params () const { return params; } @@ -856,7 +852,6 @@ public: bool is_equal (const BaseType &other) const override; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; bool needs_generic_substitutions () const override final { @@ -918,9 +913,9 @@ public: bool is_equal (const BaseType &other) const override; BaseType *get_element_type () const; + const TyVar &get_var_element_type () const; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; HIR::Expr &get_capacity_expr () const { return capacity_expr; } @@ -960,9 +955,9 @@ public: bool is_equal (const BaseType &other) const override; BaseType *get_element_type () const; + const TyVar &get_var_element_type () const; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; SliceType *handle_substitions (SubstitutionArgumentMappings &mappings); @@ -986,7 +981,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; }; class IntType : public BaseType @@ -1017,7 +1011,6 @@ public: IntKind get_int_kind () const; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; bool is_equal (const BaseType &other) const override; @@ -1054,7 +1047,6 @@ public: UintKind get_uint_kind () const; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; bool is_equal (const BaseType &other) const override; @@ -1087,7 +1079,6 @@ public: FloatKind get_float_kind () const; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; bool is_equal (const BaseType &other) const override; @@ -1111,7 +1102,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; }; class ISizeType : public BaseType @@ -1130,7 +1120,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; }; class CharType : public BaseType @@ -1148,7 +1137,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; }; class StrType : public BaseType @@ -1169,7 +1157,6 @@ public: bool is_equal (const BaseType &other) const override; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; }; class ReferenceType : public BaseType @@ -1181,6 +1168,7 @@ public: std::set<HirId> refs = std::set<HirId> ()); BaseType *get_base () const; + const TyVar &get_var_element_type () const; void accept_vis (TyVisitor &vis) override; void accept_vis (TyConstVisitor &vis) const override; @@ -1194,18 +1182,14 @@ public: bool is_equal (const BaseType &other) const override; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; ReferenceType *handle_substitions (SubstitutionArgumentMappings &mappings); Mutability mutability () const; - bool is_mutable () const; bool is_dyn_object () const; - bool is_dyn_slice_type (const TyTy::SliceType **slice = nullptr) const; - bool is_dyn_str_type (const TyTy::StrType **str = nullptr) const; private: @@ -1222,6 +1206,7 @@ public: std::set<HirId> refs = std::set<HirId> ()); BaseType *get_base () const; + const TyVar &get_var_element_type () const; void accept_vis (TyVisitor &vis) override; void accept_vis (TyConstVisitor &vis) const override; @@ -1234,7 +1219,6 @@ public: bool is_equal (const BaseType &other) const override; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; PointerType *handle_substitions (SubstitutionArgumentMappings &mappings); @@ -1242,7 +1226,6 @@ public: bool is_mutable () const; bool is_const () const; bool is_dyn_object () const; - bool is_dyn_slice_type (const TyTy::SliceType **slice = nullptr) const; bool is_dyn_str_type (const TyTy::StrType **str = nullptr) const; @@ -1276,7 +1259,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; std::string get_name () const override final; }; @@ -1299,7 +1281,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; std::string get_name () const override final; @@ -1344,7 +1325,6 @@ public: bool can_eq (const BaseType *other, bool emit_errors) const override final; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; std::string get_name () const override final; @@ -1387,7 +1367,6 @@ public: bool is_equal (const BaseType &other) const override; BaseType *clone () const final override; - BaseType *monomorphized_clone () const final override; std::string get_name () const override final; |