18 static const size_t kModuleTags[] = { eObrTagModules, eObrTagImports };
19 static const size_t kDeclTags[] = { eObrTagTypes };
23 .module_count =
sizeof(kModuleTags) /
sizeof(
size_t),
25 .decl_tags = kDeclTags,
26 .decl_count =
sizeof(kDeclTags) /
sizeof(
size_t)
51 static size_t sema_array_length(
tree_t *sema,
obr_t *expr)
54 if (expr == NULL)
return SIZE_MAX;
57 if (
tree_is(it, eTreeExprDigit))
79 msg_notify(sema->
reports, &kEvent_ArrayLengthNotConstant, it->
node,
"array length must be a constant");
86 size_t len = sema_array_length(sema,
size);
103 for (
size_t i = len; i > 0; i--)
106 it = sema_array_segment(sema,
size, it, name);
117 for (
size_t i = 0; i < len; i++)
137 case eObrTypeArray:
return sema_type_array(sema, type, name);
159 static bool is_open_array(
const tree_t *type)
169 if ((is_open_array(exprtype) &&
tree_is(type, eTreeTypePointer))
170 || (is_open_array(type) &&
tree_is(exprtype, eTreeTypePointer))
179 if (
tree_is(exprtype, eTreeTypeArray) &&
tree_is(type, eTreeTypeArray))
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_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
CT_NOTIFY_API event_builder_t msg_notify(INOUT_NOTNULL logger_t *logs, const diagnostic_t *diagnostic, const node_t *node, STA_FORMAT_STRING const char *fmt,...)
notify the logger of a new message
#define CT_NEVER(...)
assert that a code path is never reached
#define CTASSERT(expr)
assert a condition, prints the condition as a message
CT_UTIL_API tree_t * util_search_qualified(tree_t *sema, const decl_search_t *search, const node_t *node, const char *mod, const char *name)
search for a decl inside a module
CT_UTIL_API bool util_length_bounded(size_t length)
check if the length of an array is bounded
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_decl_struct(const node_t *node, const char *name, vector_t *fields)
CT_TREE_API tree_t * tree_expr_cast(const node_t *node, const tree_t *type, const tree_t *expr, tree_cast_t cast)
create a cast expression
CT_TREE_API tree_t * tree_decl_field(const node_t *node, const char *name, const tree_t *type)
CT_TREE_API tree_t * tree_type_pointer(const node_t *node, const char *name, const tree_t *pointer, size_t length)
create a pointer type
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_type_array(const node_t *node, const char *name, const tree_t *array, size_t length)
create a new array 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_of(size_t len, arena_t *arena)
create a new vector with a specified length
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
const tree_t * obr_rvalue_type(const tree_t *self)
tree_t * obr_cast_type(tree_t *expr, const tree_t *type)
tree_t * obr_sema_type(tree_t *sema, obr_t *type, const char *name)
tree_t * obr_sema_rvalue(tree_t *sema, obr_t *expr, const tree_t *implicit_type)
tree_t * obr_get_integer_type(void)
tree_t * obr_get_type(tree_t *sema, const char *name)
const size_t * module_tags
a generic vector of pointers