| ... | ... | @@ -218,14 +218,24 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) { |
| 218 | 218 | static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) { |
| 219 | 219 | assert(node->type == NodeTypeArrayAccessExpr); |
| 220 | 220 | |
| 221 | | TypeTableEntry *type_entry = get_expr_type(node->data.array_access_expr.array_ref_expr); |
| 222 | 221 | AstNode *array_expr_node = node->data.array_access_expr.array_ref_expr; |
| 222 | TypeTableEntry *type_entry = get_expr_type(array_expr_node); |
| 223 | 223 | |
| 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 | } |
| 225 | 235 | |
| 226 | | LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript); |
| 236 | assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind); |
| 227 | 237 | |
| 228 | | assert(array_ptr); |
| 238 | LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript); |
| 229 | 239 | assert(subscript_value); |
| 230 | 240 | |
| 231 | 241 | if (type_entry->id == TypeTableEntryIdArray) { |