aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-04 19:10:52 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-04 19:11:36 -0700
commite0aa0736be47e5e1383d8fb25f744f95c5a830ba (patch)
tree0ae86d7782de9e73d21449fd70a9fc3383cdad0a /src/codegen.cpp
parent22c52f1eb67a46e60be876fda332ad7d2f338ee7 (diff)
downloadzig-e0aa0736be47e5e1383d8fb25f744f95c5a830ba.tar.gz
zig-e0aa0736be47e5e1383d8fb25f744f95c5a830ba.zip
add pointer dereferencing operator
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 08fc24fef3..32c34e6323 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -359,6 +359,13 @@ static LLVMValueRef gen_lvalue(CodeGen *g, AstNode *expr_node, AstNode *node,
}
} else if (node->type == NodeTypeFieldAccessExpr) {
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;
+ TypeTableEntry *type_entry = get_expr_type(target_expr);
+ assert(type_entry->id == TypeTableEntryIdPointer);
+ *out_type_entry = type_entry->data.pointer.child_type;
+ return gen_expr(g, target_expr);
} else {
zig_panic("bad assign target");
}
@@ -397,11 +404,16 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
case PrefixOpAddressOf:
case PrefixOpConstAddressOf:
{
- add_debug_source_node(g, node);
TypeTableEntry *lvalue_type;
return gen_lvalue(g, node, expr_node, &lvalue_type);
}
+ case PrefixOpDereference:
+ {
+ LLVMValueRef expr = gen_expr(g, expr_node);
+ add_debug_source_node(g, node);
+ return LLVMBuildLoad(g->builder, expr, "");
+ }
}
zig_unreachable();
}