aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2015-12-15 02:58:01 -0700
committerAndrew Kelley <superjoe30@gmail.com>2015-12-15 02:58:01 -0700
commitde7c5ea1026db1c32fac522c71e9d5c57de6ed14 (patch)
treeab2f6b30f92f9ec30773b66fca369d8d41380627 /src/codegen.cpp
parent1f48b626a1cef1168d23654f5a9f21ed2196738e (diff)
downloadzig-de7c5ea1026db1c32fac522c71e9d5c57de6ed14.tar.gz
zig-de7c5ea1026db1c32fac522c71e9d5c57de6ed14.zip
codegen: add support for shortening cast
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 2863335747..254e9f4d23 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -292,10 +292,16 @@ static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) {
if (actual_type->data.integral.is_signed && wanted_type->data.integral.is_signed) {
return LLVMBuildSExt(g->builder, expr_val, wanted_type->type_ref, "");
} else {
- zig_panic("TODO gen_cast_expr sign mismatch");
+ zig_panic("TODO gen_cast_expr widen unsigned");
}
} else {
- zig_panic("TODO gen_cast_expr");
+ assert(actual_type->size_in_bits > wanted_type->size_in_bits);
+
+ if (actual_type->data.integral.is_signed && wanted_type->data.integral.is_signed) {
+ return LLVMBuildTrunc(g->builder, expr_val, wanted_type->type_ref, "");
+ } else {
+ zig_panic("TODO gen_cast_expr shorten unsigned");
+ }
}
case CastOpArrayToString:
{