aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-04-13 10:13:49 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-04-13 10:13:49 -0700
commit3f9632bb404584db872ed8e2318f770cde8b16ee (patch)
treeb1a1bae8ba15dbb95d2dd92dc98e65c5eed140d9
parent3c27cb25279049cfdcde99d49045f5b8ec8981ba (diff)
downloadzig-3f9632bb404584db872ed8e2318f770cde8b16ee.tar.gz
zig-3f9632bb404584db872ed8e2318f770cde8b16ee.zip
eval: support array literals
-rw-r--r--src/eval.cpp22
-rw-r--r--test/self_hosted.zig14
2 files changed, 36 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");
}
diff --git a/test/self_hosted.zig b/test/self_hosted.zig
index 4513b06dd7..b36627855e 100644
--- a/test/self_hosted.zig
+++ b/test/self_hosted.zig
@@ -961,3 +961,17 @@ fn static_while_loop_2() -> i32 {
return 1;
}
}
+
+#attribute("test")
+fn static_eval_list_init() {
+ assert(static_vec3.data[2] == 1.0);
+}
+const static_vec3 = vec3(0.0, 0.0, 1.0);
+pub struct Vec3 {
+ data: [3]f32,
+}
+pub fn vec3(x: f32, y: f32, z: f32) -> Vec3 {
+ Vec3 {
+ .data = []f32 { x, y, z, },
+ }
+}