aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-08-11 22:25:13 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-08-11 22:25:13 -0700
commit0ae9023832584e256aa3b6df0f0829026141d21a (patch)
tree78b989a47e93169227a1d08d7b1da1499a04ee87 /src/codegen.cpp
parent0a482bbbfe1dbabaab6b7a5c26ec4f29f0c618d9 (diff)
downloadzig-0ae9023832584e256aa3b6df0f0829026141d21a.tar.gz
zig-0ae9023832584e256aa3b6df0f0829026141d21a.zip
add CBuf to standard library
and fix ability to take address of variables from other namespaces
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;