48 if (
tree_is(fn, eTreeError)) {
return; }
63 for (
size_t i = 0; i < len; i++)
66 add_param(&inner, param);
101 for (
size_t i = 0; i < len; i++)
117 self->params = params;
CT_PUREFN CT_TREE_API const node_t * tree_get_node(const tree_t *tree)
CT_PUREFN CT_TREE_API const char * tree_get_name(const tree_t *tree)
CT_PUREFN CT_TREE_API const tree_t * tree_get_type(const tree_t *tree)
CT_PUREFN CT_TREE_API bool tree_is(const tree_t *self, tree_kind_t kind)
CT_PUREFN CT_TREE_API const tree_t * tree_fn_get_return(const tree_t *self)
CT_PUREFN CT_TREE_API const vector_t * tree_fn_get_params(const tree_t *self)
tree_t * ctu_sema_stmt(ctu_sema_t *sema, const ctu_t *stmt)
void ctu_add_decl(tree_t *sema, ctu_tag_t tag, const char *name, tree_t *decl)
ctu_sema_t ctu_sema_init(tree_t *sema, tree_t *decl, vector_t *block)
tree_t * ctu_get_void_type(void)
tree_t * ctu_sema_type(ctu_sema_t *sema, const ctu_t *type)
void ctu_resolve_function(tree_t *sema, tree_t *self, void *user)
void ctu_resolve_function_type(tree_t *sema, tree_t *self, void *user)
CT_MEMORY_API arena_t * get_global_arena(void)
get the global memory arena
CT_BEGIN_API CT_UTIL_API bool util_types_equal(const tree_t *lhs, const tree_t *rhs)
compare two types for strict equality compares two types for exact equality, does not follow typedefs
CT_TREE_API tree_t * tree_expr_unit(const node_t *node, const tree_t *type)
CT_TREE_API tree_t * tree_type_reference(const node_t *node, const char *name, const tree_t *reference)
create a reference type
CT_TREE_API tree_t * tree_type_closure(const node_t *node, const char *name, const tree_t *result, const vector_t *params, tree_arity_t arity)
create a function pointer type
CT_TREE_API tree_t * tree_module(tree_t *parent, const node_t *node, const char *name, size_t decls, const size_t *sizes)
create a new module
CT_TREE_API void tree_close_function(tree_t *self, tree_t *body)
CT_TREE_API tree_t * tree_stmt_return(const node_t *node, const tree_t *value)
create a return statement
CT_TREE_API tree_cookie_t * tree_get_cookie(tree_t *sema)
return a resolution cookie
CT_TREE_API tree_t * tree_decl_param(const node_t *node, const char *name, const tree_t *type)
CT_TREE_API tree_t * tree_resolve_type(tree_cookie_t *cookie, const tree_t *decl)
CT_TREE_API tree_t * tree_stmt_assign(const node_t *node, tree_t *dst, const tree_t *src)
CT_TREE_API tree_t * tree_stmt_block(const node_t *node, const vector_t *stmts)
create a block statement
CT_TREE_API void tree_set_type(tree_t *self, const tree_t *type)
CT_TREE_API void tree_add_local(tree_t *self, tree_t *decl)
CT_TREE_API tree_t * tree_decl_local(const node_t *node, const char *name, tree_storage_t storage, const tree_t *type)
CT_NODISCARD CT_PUREFN CT_STD_API void * vector_get(const vector_t *vector, size_t index)
get a value from a vector
CT_NODISCARD CT_STD_API vector_t * vector_new(size_t size, arena_t *arena)
create a new vector with an initial capacity
CT_NODISCARD CT_STD_API vector_t * vector_of(size_t len, arena_t *arena)
create a new vector with a specified length
CT_STD_API void vector_push(vector_t **vector, void *value)
push a value onto the end of a vector
CT_STD_API void vector_set(vector_t *vector, size_t index, void *value)
set a value in a vector
CT_NODISCARD CT_PUREFN CT_STD_API size_t vector_len(const vector_t *vector)
get the length of a vector
ctu_t * begin_resolve(tree_t *sema, tree_t *self, void *user, ctu_kind_t kind)
vector_t * block
current statement block
tree_t * decl
current decl
tree_t * sema
current scope
a position in a source file
const tree_t * storage
the underlying storage type
a generic vector of pointers