diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-01-06 02:43:29 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-01-06 02:43:29 -0700 |
| commit | 8b48e242b8bc61080433ae541653cfcdfa274e59 (patch) | |
| tree | d15b5387a050e37e4cc89c8748c3f486a2976e07 /src/codegen.cpp | |
| parent | 9c775d21112bad6d1135c9275147dff9abb954ac (diff) | |
| download | zig-8b48e242b8bc61080433ae541653cfcdfa274e59.tar.gz zig-8b48e242b8bc61080433ae541653cfcdfa274e59.zip | |
codegen: fix array access of struct field
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index e2bbdfc656..fbafa5c3cd 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -218,14 +218,24 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) { static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeArrayAccessExpr); - TypeTableEntry *type_entry = get_expr_type(node->data.array_access_expr.array_ref_expr); AstNode *array_expr_node = node->data.array_access_expr.array_ref_expr; + TypeTableEntry *type_entry = get_expr_type(array_expr_node); - LLVMValueRef array_ptr = gen_expr(g, array_expr_node); + LLVMValueRef array_ptr; + if (array_expr_node->type == NodeTypeFieldAccessExpr) { + array_ptr = gen_field_access_expr(g, array_expr_node, true); + if (type_entry->id == TypeTableEntryIdPointer) { + // we have a double pointer so we must dereference it once + add_debug_source_node(g, node); + array_ptr = LLVMBuildLoad(g->builder, array_ptr, ""); + } + } else { + array_ptr = gen_expr(g, array_expr_node); + } - LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript); + assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind); - assert(array_ptr); + LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript); assert(subscript_value); if (type_entry->id == TypeTableEntryIdArray) { |
