diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-04-13 10:13:49 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-04-13 10:13:49 -0700 |
| commit | 3f9632bb404584db872ed8e2318f770cde8b16ee (patch) | |
| tree | b1a1bae8ba15dbb95d2dd92dc98e65c5eed140d9 /src | |
| parent | 3c27cb25279049cfdcde99d49045f5b8ec8981ba (diff) | |
| download | zig-3f9632bb404584db872ed8e2318f770cde8b16ee.tar.gz zig-3f9632bb404584db872ed8e2318f770cde8b16ee.zip | |
eval: support array literals
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/eval.cpp b/src/eval.cpp index 34656c41e1..b3120118c6 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -359,6 +359,28 @@ static bool eval_container_init_expr(EvalFn *ef, AstNode *node, ConstExprValue * add_error_note(ef->root->codegen, msg, ef->root->call_node, buf_sprintf("called from here")); add_error_note(ef->root->codegen, msg, node, buf_sprintf("unreachable expression here")); return true; + } else if (container_type->id == TypeTableEntryIdStruct && + container_type->data.structure.is_unknown_size_array && + kind == ContainerInitKindArray) + { + + int elem_count = container_init_expr->entries.length; + + out_val->ok = true; + out_val->data.x_array.fields = allocate<ConstExprValue*>(elem_count); + + for (int i = 0; i < elem_count; i += 1) { + AstNode *elem_node = container_init_expr->entries.at(i); + + ConstExprValue *elem_val = allocate<ConstExprValue>(1); + if (eval_expr(ef, elem_node, elem_val)) return true; + + assert(elem_val->ok); + + out_val->data.x_array.fields[i] = elem_val; + out_val->depends_on_compile_var = out_val->depends_on_compile_var || + elem_val->depends_on_compile_var; + } } else { zig_panic("TODO"); } |
