Commit 8b48e242b8

Andrew Kelley <superjoe30@gmail.com>
2016-01-06 10:43:29
codegen: fix array access of struct field
1 parent 9c775d2
Changed files (1)
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) {