diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-12-15 18:21:59 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-12-15 18:21:59 -0700 |
| commit | 28c5a8f2cab193858717594fc91df3369980e18c (patch) | |
| tree | 07b834180f508e1f18e881509e6aed792d55ddf8 /src/codegen.cpp | |
| parent | 431d8f946fc1340475bd6d849d74a741fd119251 (diff) | |
| download | zig-28c5a8f2cab193858717594fc91df3369980e18c.tar.gz zig-28c5a8f2cab193858717594fc91df3369980e18c.zip | |
analyze: clean up type checking
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 20 |
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; |
