aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-04-20 11:58:01 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-04-20 11:58:01 -0700
commit6acc354957752e2cfa8d67bdd0e4c3b42f9be3c3 (patch)
treedf6c6511e3ded50d1be9d59940d093a3470b93b4 /src/codegen.cpp
parenta25307c0a1b45d0c7b83158349fbc57626baf656 (diff)
downloadzig-6acc354957752e2cfa8d67bdd0e4c3b42f9be3c3.tar.gz
zig-6acc354957752e2cfa8d67bdd0e4c3b42f9be3c3.zip
for loop: add ability to get pointer to elem var
see #51
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 65720f6d59..80eb4b2089 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -2427,9 +2427,14 @@ static LLVMValueRef gen_for_expr(CodeGen *g, AstNode *node) {
LLVMPositionBuilderAtEnd(g->builder, body_block);
LLVMValueRef elem_ptr = gen_array_elem_ptr(g, node, array_val, array_type, index_val);
- LLVMValueRef elem_val = handle_is_ptr(child_type) ? elem_ptr : LLVMBuildLoad(g->builder, elem_ptr, "");
- gen_assign_raw(g, node, BinOpTypeAssign, elem_var->value_ref, elem_val,
- elem_var->type, child_type);
+
+ LLVMValueRef elem_val;
+ if (node->data.for_expr.elem_is_ptr) {
+ elem_val = elem_ptr;
+ } else {
+ elem_val = handle_is_ptr(child_type) ? elem_ptr : LLVMBuildLoad(g->builder, elem_ptr, "");
+ }
+ gen_assign_raw(g, node, BinOpTypeAssign, elem_var->value_ref, elem_val, elem_var->type, child_type);
gen_var_debug_decl(g, elem_var);
g->break_block_stack.append(end_block);
g->continue_block_stack.append(continue_block);