30 const tree_t *type = implicit_type == NULL
54 const tree_t *type = implicit_type == NULL
80 if (var != NULL) {
return var; }
83 if (fn != NULL) {
return fn; }
86 if (mod != NULL) {
return mod; }
93 tree_t *name = sema_name(sema, expr);
94 if (!
tree_is(name, eTreeDeclParam))
102 static const tree_t *get_param_checked(
const vector_t *params,
size_t i)
116 if (
tree_is(callee, eTreeError)) {
return callee; }
123 for (
size_t i = 0; i < len; i++)
126 const tree_t *expected = get_param_checked(params, i);
140 case eTreeDeclModule:
return sema_name(decl, expr);
141 case eTreeError:
return decl;
146 if (!
tree_is(resolved, eTreeTypeStruct))
204 case eTreeTypeDigit: {
243 [eObrTagModules] = 4,
244 [eObrTagImports] = 4,
318 for (
size_t i = 0; i < len; i++)
321 tree_t *tree = sema_stmt(sema, stmt);
CT_PUREFN CT_TREE_API tree_kind_t tree_get_kind(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_TREE_API const char * tree_to_string(const tree_t *self)
CT_PUREFN CT_TREE_API tree_t * tree_ty_get_field(const tree_t *self, const char *name)
CT_PUREFN CT_TREE_API const vector_t * tree_fn_get_params(const tree_t *self)
CT_PUREFN CT_TREE_API const tree_t * tree_ty_load_type(const tree_t *self)
get the type of a type after it has been loaded
CT_MEMORY_API arena_t * get_global_arena(void)
get the global memory arena
#define CT_UNUSED(x)
mark a variable as unused
#define CT_NEVER(...)
assert that a code path is never reached
CT_UTIL_API bool util_types_comparable(tree_cookie_t *cookie, const tree_t *lhs, const tree_t *rhs)
query two types for comparability in binary logic operations
CT_TREE_API tree_t * tree_expr_unit(const node_t *node, const tree_t *type)
CT_TREE_API tree_t * tree_expr_field(const node_t *node, const tree_t *type, tree_t *object, tree_t *field)
CT_TREE_API tree_t * tree_stmt_loop(const node_t *node, tree_t *cond, tree_t *body, tree_t *other)
CT_TREE_API tree_t * tree_expr_digit(const node_t *node, const tree_t *type, const mpz_t value)
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 tree_t * tree_expr_unary(const node_t *node, unary_t unary, tree_t *expr)
CT_TREE_API tree_t * tree_stmt_return(const node_t *node, const tree_t *value)
create a return statement
CT_TREE_API tree_t * tree_expr_compare(const node_t *node, const tree_t *type, compare_t compare, const tree_t *lhs, const tree_t *rhs)
CT_TREE_API tree_cookie_t * tree_get_cookie(tree_t *sema)
return a resolution cookie
CT_TREE_API tree_t * tree_raise(const node_t *node, logger_t *reports, const diagnostic_t *diagnostic, const char *message,...)
CT_TREE_API tree_t * tree_expr_call(const node_t *node, const tree_t *callee, const vector_t *args)
CT_TREE_API tree_t * tree_expr_string(const node_t *node, const tree_t *type, const char *value, size_t length)
create a string expression
CT_TREE_API tree_t * tree_expr_bool(const node_t *node, const tree_t *type, bool value)
CT_TREE_API tree_t * tree_expr_binary(const node_t *node, const tree_t *type, binary_t binary, const tree_t *lhs, const tree_t *rhs)
CT_TREE_API tree_t * tree_expr_load(const node_t *node, tree_t *expr)
load a value from a pointer or storage
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 tree_t * tree_resolve(tree_cookie_t *cookie, const tree_t *decl)
CT_TREE_API tree_t * tree_stmt_branch(const node_t *node, tree_t *cond, tree_t *then, tree_t *other)
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_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
tree_t * obr_get_symbol(tree_t *sema, obr_tag_t tag, const char *name)
getters
tree_t * obr_get_integer_type(void)
tree_t * obr_get_string_type(const node_t *node, size_t length)
tree_t * obr_get_void_type(void)
tree_t * obr_get_bool_type(void)
builtin types
tree_t * obr_get_namespace(tree_t *sema, const char *name)
tree_t * obr_cast_type(tree_t *expr, const tree_t *type)
tree_t * obr_default_value(const node_t *node, const tree_t *type)
tree_t * obr_sema_rvalue(tree_t *sema, obr_t *expr, const tree_t *implicit_type)
tree_t * obr_sema_lvalue(tree_t *sema, obr_t *expr)
tree_t * obr_sema_stmts(tree_t *sema, const node_t *node, vector_t *stmts)
a position in a source file
a generic vector of pointers