#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"
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
{
return clone;
}
-BaseType *
-InferType::monomorphized_clone () const
-{
- return clone ();
-}
-
bool
InferType::default_type (BaseType **type) 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,
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)
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)
{
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)
{
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)
{
specified_bounds);
}
-BaseType *
-ClosureType::monomorphized_clone () const
-{
- return clone ();
-}
-
ClosureType *
ClosureType::handle_substitions (SubstitutionArgumentMappings &mappings)
{
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 *
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 *
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)
get_combined_refs ());
}
-BaseType *
-IntType::monomorphized_clone () const
-{
- return clone ();
-}
-
bool
IntType::is_equal (const BaseType &other) const
{
get_combined_refs ());
}
-BaseType *
-UintType::monomorphized_clone () const
-{
- return clone ();
-}
-
bool
UintType::is_equal (const BaseType &other) const
{
get_combined_refs ());
}
-BaseType *
-FloatType::monomorphized_clone () const
-{
- return clone ();
-}
-
bool
FloatType::is_equal (const BaseType &other) 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)
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)
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,
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 ());
}
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 ());
}
get_combined_refs ());
}
-BaseType *
-ParamType::monomorphized_clone () const
-{
- return resolve ()->clone ();
-}
-
std::string
ParamType::get_symbol () 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)
{
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,
get_combined_refs ());
}
-BaseType *
-PlaceholderType::monomorphized_clone () const
-{
- if (can_resolve ())
- return resolve ()->monomorphized_clone ();
-
- return clone ();
-}
-
void
PlaceholderType::set_associated_type (HirId ref)
{
get_combined_refs ());
}
-BaseType *
-ProjectionType::monomorphized_clone () const
-{
- return get ()->monomorphized_clone ();
-}
-
ProjectionType *
ProjectionType::handle_substitions (
SubstitutionArgumentMappings &subst_mappings)
specified_bounds, get_combined_refs ());
}
-BaseType *
-DynamicObjectType::monomorphized_clone () const
-{
- return clone ();
-}
-
std::string
DynamicObjectType::get_name () const
{
* 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;
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;
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;
};
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;
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;
}
BaseType *clone () const final override;
- BaseType *monomorphized_clone () const final override;
bool needs_generic_substitutions () const override final
{
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
{
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;
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 (); }
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; }
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
{
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; }
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);
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
IntKind get_int_kind () const;
BaseType *clone () const final override;
- BaseType *monomorphized_clone () const final override;
bool is_equal (const BaseType &other) const override;
UintKind get_uint_kind () const;
BaseType *clone () const final override;
- BaseType *monomorphized_clone () const final override;
bool is_equal (const BaseType &other) const override;
FloatKind get_float_kind () const;
BaseType *clone () const final override;
- BaseType *monomorphized_clone () const final override;
bool is_equal (const BaseType &other) const override;
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
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
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
bool is_equal (const BaseType &other) const override;
BaseType *clone () const final override;
- BaseType *monomorphized_clone () const final override;
};
class ReferenceType : public BaseType
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;
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:
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;
bool is_equal (const BaseType &other) const override;
BaseType *clone () const final override;
- BaseType *monomorphized_clone () const final override;
PointerType *handle_substitions (SubstitutionArgumentMappings &mappings);
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;
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;
};
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;
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;
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;