aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index d77eda5bf6..9592fafba5 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -1243,6 +1243,11 @@ static LLVMValueRef gen_field_ptr(CodeGen *g, AstNode *node, TypeTableEntry **ou
AstNode *struct_expr_node = node->data.field_access_expr.struct_expr;
+ *out_type_entry = node->data.field_access_expr.type_struct_field->type_entry;
+ if (!type_has_bits(*out_type_entry)) {
+ return nullptr;
+ }
+
LLVMValueRef struct_ptr;
if (struct_expr_node->type == NodeTypeSymbol) {
VariableTableEntry *var = get_resolved_expr(struct_expr_node)->variable;
@@ -1272,8 +1277,6 @@ static LLVMValueRef gen_field_ptr(CodeGen *g, AstNode *node, TypeTableEntry **ou
int gen_field_index = node->data.field_access_expr.type_struct_field->gen_index;
assert(gen_field_index >= 0);
- *out_type_entry = node->data.field_access_expr.type_struct_field->type_entry;
-
set_debug_source_node(g, node);
return LLVMBuildStructGEP(g->builder, struct_ptr, gen_field_index, "");
}
@@ -1490,7 +1493,14 @@ static LLVMValueRef gen_lvalue(CodeGen *g, AstNode *expr_node, AstNode *node,
zig_unreachable();
}
} else if (node->type == NodeTypeFieldAccessExpr) {
- target_ref = gen_field_ptr(g, node, out_type_entry);
+ AstNode *struct_expr_node = node->data.field_access_expr.struct_expr;
+ TypeTableEntry *struct_type = get_expr_type(struct_expr_node);
+ if (struct_type->id == TypeTableEntryIdNamespace) {
+ target_ref = gen_field_access_expr(g, node, true);
+ *out_type_entry = get_expr_type(node);
+ } else {
+ target_ref = gen_field_ptr(g, node, out_type_entry);
+ }
} else if (node->type == NodeTypePrefixOpExpr) {
assert(node->data.prefix_op_expr.prefix_op == PrefixOpDereference);
AstNode *target_expr = node->data.prefix_op_expr.primary_expr;