authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-13 10:13:49-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-13 10:13:49-07:00
log3f9632bb404584db872ed8e2318f770cde8b16ee
treeb1a1bae8ba15dbb95d2dd92dc98e65c5eed140d9
parent3c27cb25279049cfdcde99d49045f5b8ec8981ba

eval: support array literals


2 files changed, 36 insertions(+), 0 deletions(-)

src/eval.cpp+22
...@@ -359,6 +359,28 @@ static bool eval_container_init_expr(EvalFn *ef, AstNode *node, ConstExprValue *...@@ -359,6 +359,28 @@ static bool eval_container_init_expr(EvalFn *ef, AstNode *node, ConstExprValue *
359 add_error_note(ef->root->codegen, msg, ef->root->call_node, buf_sprintf("called from here"));359 add_error_note(ef->root->codegen, msg, ef->root->call_node, buf_sprintf("called from here"));
360 add_error_note(ef->root->codegen, msg, node, buf_sprintf("unreachable expression here"));360 add_error_note(ef->root->codegen, msg, node, buf_sprintf("unreachable expression here"));
361 return true;361 return true;
362 } else if (container_type->id == TypeTableEntryIdStruct &&
363 container_type->data.structure.is_unknown_size_array &&
364 kind == ContainerInitKindArray)
365 {
366
367 int elem_count = container_init_expr->entries.length;
368
369 out_val->ok = true;
370 out_val->data.x_array.fields = allocate<ConstExprValue*>(elem_count);
371
372 for (int i = 0; i < elem_count; i += 1) {
373 AstNode *elem_node = container_init_expr->entries.at(i);
374
375 ConstExprValue *elem_val = allocate<ConstExprValue>(1);
376 if (eval_expr(ef, elem_node, elem_val)) return true;
377
378 assert(elem_val->ok);
379
380 out_val->data.x_array.fields[i] = elem_val;
381 out_val->depends_on_compile_var = out_val->depends_on_compile_var ||
382 elem_val->depends_on_compile_var;
383 }
362 } else {384 } else {
363 zig_panic("TODO");385 zig_panic("TODO");
364 }386 }
test/self_hosted.zig+14
...@@ -961,3 +961,17 @@ fn static_while_loop_2() -> i32 {...@@ -961,3 +961,17 @@ fn static_while_loop_2() -> i32 {
961 return 1;961 return 1;
962 }962 }
963}963}
964
965#attribute("test")
966fn static_eval_list_init() {
967 assert(static_vec3.data[2] == 1.0);
968}
969const static_vec3 = vec3(0.0, 0.0, 1.0);
970pub struct Vec3 {
971 data: [3]f32,
972}
973pub fn vec3(x: f32, y: f32, z: f32) -> Vec3 {
974 Vec3 {
975 .data = []f32 { x, y, z, },
976 }
977}