10#include <llvm/IR/Type.h>
41 [[nodiscard]]
auto size() const ->
int {
return m_size; }
42 [[nodiscard]]
auto is_signed() const ->
bool {
return m_signed; }
43 [[nodiscard]]
auto name() const ->
string override {
return base_name(); };
44 [[nodiscard]]
auto in_range(int64_t num)
const -> bool;
45 static auto classof(
const BaseType* a) ->
bool {
return a->kind() ==
K_Int; }
54 [[nodiscard]]
auto name() const ->
string override {
return nil_name; };
55 static auto classof(
const BaseType* a) ->
bool {
return a->kind() ==
K_Nil; }
73 [[nodiscard]]
auto name() const ->
string override;
74 static auto classof(const
BaseType* a) ->
bool {
return a->kind() ==
K_Ptr; }
79 vector<ast::TypeName*> m_fields;
100 mutable std::unordered_map<Substitutions, unique_ptr<Struct>> m_instantiations{};
101 mutable llvm::Type* m_memo{};
111 [[nodiscard]]
auto fields() const -> const auto& {
return m_fields; }
112 [[nodiscard]]
auto fields() ->
auto& {
return m_fields; }
113 [[nodiscard]]
auto subs() const -> const auto* {
return m_subs; }
114 [[nodiscard]]
auto subs() ->
auto* {
return m_subs; }
118 [[nodiscard]] auto
name() const ->
string override;
120 [[nodiscard]] auto
memo() const -> auto* {
return m_memo; }
131 optional<Type> m_ret;
132 vector<Type> m_closure;
137 mutable std::unordered_map<Substitutions, unique_ptr<Function>> m_instantiations{};
139 mutable llvm::FunctionType* m_fn_memo{};
140 mutable llvm::StructType* m_closure_memo{};
141 mutable llvm::Type* m_memo{};
150 bool c_varargs =
false)
152 m_c_varargs(c_varargs) {}
153 [[nodiscard]]
auto args() const -> const auto& {
return m_args; }
154 [[nodiscard]]
auto args() ->
auto& {
return m_args; }
155 [[nodiscard]]
auto closure() const -> const auto& {
return m_closure; }
156 [[nodiscard]]
auto closure() ->
auto& {
return m_closure; }
157 [[nodiscard]]
auto ret() const -> const auto& {
return m_ret; }
158 [[nodiscard]]
auto is_fn_ptr()
const {
return m_fn_ptr; }
160 [[nodiscard]]
auto name() const ->
string override;
162 [[nodiscard]] auto
fn_memo() const -> auto* {
return m_fn_memo; }
163 [[nodiscard]]
auto closure_memo() const -> auto* {
return m_closure_memo; }
164 [[nodiscard]]
auto memo() const -> auto* {
return m_memo; }
182 static auto classof(
const BaseType* a) ->
bool {
return a->kind() ==
K_Generic; }
192 [[nodiscard]]
auto name() const ->
string override {
return base_name() +
" opaque"; };
204 [[nodiscard]]
auto name() const ->
string override {
return base_name() +
" type"; };
The Compiler the the primary top-level type during compilation. A single instance is created during t...
Represents a type in the type system. NOTE: that this isn't the class to use for type introspection,...
auto kind() const -> Kind
auto base_name() const -> string
auto name() const -> string override
Function(string name, vector< Type > args, optional< Type > ret, vector< Type > closure, bool fn_ptr, bool c_varargs=false)
void fn_memo(Compiler &, llvm::FunctionType *memo) const
auto args() const -> const auto &
void closure_memo(Compiler &, llvm::StructType *memo) const
auto is_c_varargs() const
auto ret() const -> const auto &
auto get_or_create_instantiation(Substitutions sub) const -> const Function &
auto closure_memo() const -> auto *
auto closure() const -> const auto &
auto fn_memo() const -> auto *
void memo(Compiler &, llvm::Type *memo) const
auto memo() const -> auto *
An unsubstituted generic type variable, usually something like T.
auto name() const -> string override
A built-in integral type, such as I32 or Bool.
auto name() const -> string override
Int(string name, int size, bool is_signed)
auto in_range(int64_t num) const -> bool
auto is_signed() const -> bool
auto name() const -> string override
static constexpr const auto nil_name
The "self" type of abstract or overriding functions. An extra layer of indirection is introduced for ...
OpaqueSelf(const BaseType *indirect)
auto indirect() const -> const BaseType *
auto name() const -> string override
A "qualified" type, with a stackable qualifier, i.e. ptr.
auto has_qualifier(Qualifier qual) const -> bool
auto pointee() const -> Type
auto qualifier() const -> Qualifier
auto name() const -> string override
Ptr(string name, Type base, Qualifier qual)
An user-defined struct type with associated fields.
auto memo() const -> auto *
Struct(string name, vector< ast::TypeName * > fields, nonnull< yume::Struct * > decl, nullable< const Substitutions * > subs)
auto subs() const -> const auto *
void memo(Compiler &, llvm::Type *memo) const
auto fields() const -> const auto &
auto name() const -> string override
auto implements() const -> const ast::OptionalType &
auto get_or_create_instantiation(Substitutions sub) const -> const Struct &
auto decl() const -> nonnull< yume::Struct * >
auto is_interface() const -> bool
A "qualified" type, with a non-stackable qualifier, i.e. mut.
OptionalAnyBase< Type > OptionalType