| ... | @@ -218,14 +218,24 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) { | ... | @@ -218,14 +218,24 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) { |
| 218 | static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) { | 218 | static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) { |
| 219 | assert(node->type == NodeTypeArrayAccessExpr); | 219 | assert(node->type == NodeTypeArrayAccessExpr); |
| 220 | | 220 | |
| 221 | TypeTableEntry *type_entry = get_expr_type(node->data.array_access_expr.array_ref_expr); | | |
| 222 | AstNode *array_expr_node = node->data.array_access_expr.array_ref_expr; | 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 | assert(subscript_value); | 239 | assert(subscript_value); |
| 230 | | 240 | |
| 231 | if (type_entry->id == TypeTableEntryIdArray) { | 241 | if (type_entry->id == TypeTableEntryIdArray) { |