aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2015-12-15 18:21:59 -0700
committerAndrew Kelley <superjoe30@gmail.com>2015-12-15 18:21:59 -0700
commit28c5a8f2cab193858717594fc91df3369980e18c (patch)
tree07b834180f508e1f18e881509e6aed792d55ddf8 /src/codegen.cpp
parent431d8f946fc1340475bd6d849d74a741fd119251 (diff)
downloadzig-28c5a8f2cab193858717594fc91df3369980e18c.tar.gz
zig-28c5a8f2cab193858717594fc91df3369980e18c.zip
analyze: clean up type checking
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index c51b137f1d..407eb0a7c4 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -130,7 +130,8 @@ static LLVMValueRef find_or_create_string(CodeGen *g, Buf *str, bool c) {
}
static TypeTableEntry *get_expr_type(AstNode *node) {
- return node->codegen_node->expr_node.type_entry;
+ TypeTableEntry *cast_type = node->codegen_node->expr_node.implicit_cast.type;
+ return cast_type ? cast_type : node->codegen_node->expr_node.type_entry;
}
static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) {
@@ -288,8 +289,10 @@ static LLVMValueRef gen_bare_cast(CodeGen *g, AstNode *node, LLVMValueRef expr_v
} else if (actual_type->size_in_bits < wanted_type->size_in_bits) {
if (actual_type->data.integral.is_signed && wanted_type->data.integral.is_signed) {
return LLVMBuildSExt(g->builder, expr_val, wanted_type->type_ref, "");
+ } else if (!actual_type->data.integral.is_signed && !wanted_type->data.integral.is_signed) {
+ return LLVMBuildZExt(g->builder, expr_val, wanted_type->type_ref, "");
} else {
- zig_panic("TODO gen_cast_expr widen unsigned");
+ zig_panic("TODO gen_cast_expr mixing of signness");
}
} else {
assert(actual_type->size_in_bits > wanted_type->size_in_bits);
@@ -1330,6 +1333,19 @@ static void define_builtin_types(CodeGen *g) {
}
{
TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdInt);
+ entry->type_ref = LLVMInt32Type();
+ buf_init_from_str(&entry->name, "u32");
+ entry->size_in_bits = 32;
+ entry->align_in_bits = 32;
+ entry->data.integral.is_signed = false;
+ entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name),
+ entry->size_in_bits, entry->align_in_bits,
+ LLVMZigEncoding_DW_ATE_unsigned());
+ g->type_table.put(&entry->name, entry);
+ g->builtin_types.entry_u32 = entry;
+ }
+ {
+ TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdInt);
entry->type_ref = LLVMInt64Type();
buf_init_from_str(&entry->name, "u64");
entry->size_in_bits = 64;