authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-06 02:43:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-06 02:43:29-07:00
log8b48e242b8bc61080433ae541653cfcdfa274e59
treed15b5387a050e37e4cc89c8748c3f486a2976e07
parent9c775d21112bad6d1135c9275147dff9abb954ac

codegen: fix array access of struct field


1 files changed, 14 insertions(+), 4 deletions(-)

src/codegen.cpp+14-4
......@@ -218,14 +218,24 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) {
218218static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) {
219219 assert(node->type == NodeTypeArrayAccessExpr);
220220
221 TypeTableEntry *type_entry = get_expr_type(node->data.array_access_expr.array_ref_expr);
222221 AstNode *array_expr_node = node->data.array_access_expr.array_ref_expr;
222 TypeTableEntry *type_entry = get_expr_type(array_expr_node);
223223
224 LLVMValueRef array_ptr = gen_expr(g, array_expr_node);
224 LLVMValueRef array_ptr;
225 if (array_expr_node->type == NodeTypeFieldAccessExpr) {
226 array_ptr = gen_field_access_expr(g, array_expr_node, true);
227 if (type_entry->id == TypeTableEntryIdPointer) {
228 // we have a double pointer so we must dereference it once
229 add_debug_source_node(g, node);
230 array_ptr = LLVMBuildLoad(g->builder, array_ptr, "");
231 }
232 } else {
233 array_ptr = gen_expr(g, array_expr_node);
234 }
225235
226 LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript);
236 assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind);
227237
228 assert(array_ptr);
238 LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript);
229239 assert(subscript_value);
230240
231241 if (type_entry->id == TypeTableEntryIdArray) {