aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-06 02:43:29 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-06 02:43:29 -0700
commit8b48e242b8bc61080433ae541653cfcdfa274e59 (patch)
treed15b5387a050e37e4cc89c8748c3f486a2976e07 /src/codegen.cpp
parent9c775d21112bad6d1135c9275147dff9abb954ac (diff)
downloadzig-8b48e242b8bc61080433ae541653cfcdfa274e59.tar.gz
zig-8b48e242b8bc61080433ae541653cfcdfa274e59.zip
codegen: fix array access of struct field
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp18
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) {