diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-12-30 15:45:10 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-12-30 15:45:10 +0000 |
| commit | 23d32f34e526cfb657a72e5b2dab86d1df765f0f (patch) | |
| tree | 7998bcf40ca9f581be6296bf4f68c102a5d234c8 /src/checker/types.c | |
| parent | d714bece47ea058e482389452cd428dad9c28fd0 (diff) | |
Block Expressions and `give`
Diffstat (limited to 'src/checker/types.c')
| -rw-r--r-- | src/checker/types.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/checker/types.c b/src/checker/types.c index c3fff7e01..e58876025 100644 --- a/src/checker/types.c +++ b/src/checker/types.c @@ -775,6 +775,65 @@ Type *default_type(Type *type) { return type; } +// NOTE(bill): Valid Compile time execution #run type +bool is_type_cte_safe(Type *type) { + type = default_type(base_type(type)); + switch (type->kind) { + case Type_Basic: + switch (type->Basic.kind) { + case Basic_rawptr: + case Basic_any: + return false; + } + return true; + + case Type_Pointer: + return false; + + case Type_Array: + return is_type_cte_safe(type->Array.elem); + + case Type_Vector: // NOTE(bill): This should always to be true but this is for sanity reasons + return is_type_cte_safe(type->Vector.elem); + + case Type_Slice: + return false; + + case Type_Maybe: + return is_type_cte_safe(type->Maybe.elem); + + case Type_Record: { + if (type->Record.kind != TypeRecord_Struct) { + return false; + } + for (isize i = 0; i < type->Record.field_count; i++) { + Entity *v = type->Record.fields[i]; + if (!is_type_cte_safe(v->type)) { + return false; + } + } + return true; + } + + case Type_Tuple: { + for (isize i = 0; i < type->Tuple.variable_count; i++) { + Entity *v = type->Tuple.variables[i]; + if (!is_type_cte_safe(v->type)) { + return false; + } + } + return true; + } + + case Type_Proc: + // TODO(bill): How should I handle procedures in the CTE stage? + // return type->Proc.calling_convention == ProcCC_Odin; + return false; + } + + return false; +} + |