aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-09-18 15:05:47 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-09-18 15:05:47 -0400
commit4b2719b51d7ec9a38bad57ca02040231b6e8df26 (patch)
tree7f3af852912303da208a806274f95c335ba9cb8a /src/codegen.cpp
parenta2abdb185f9e47b663edce1bdfa3fa525502f321 (diff)
parent8c77c5705f41e55a5f2d80db20270d0c644338ed (diff)
downloadzig-4b2719b51d7ec9a38bad57ca02040231b6e8df26.tar.gz
zig-4b2719b51d7ec9a38bad57ca02040231b6e8df26.zip
Merge remote-tracking branch 'origin/master' into llvm7
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index cad3694fe0..91e7c8dde9 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -1662,6 +1662,22 @@ static LLVMValueRef gen_widen_or_shorten(CodeGen *g, bool want_runtime_safety, Z
if (actual_type->id == ZigTypeIdFloat) {
return LLVMBuildFPTrunc(g->builder, expr_val, wanted_type->type_ref, "");
} else if (actual_type->id == ZigTypeIdInt) {
+ if (wanted_bits == 0) {
+ if (!want_runtime_safety)
+ return nullptr;
+
+ LLVMValueRef zero = LLVMConstNull(actual_type->type_ref);
+ LLVMValueRef ok_bit = LLVMBuildICmp(g->builder, LLVMIntEQ, expr_val, zero, "");
+ LLVMBasicBlockRef ok_block = LLVMAppendBasicBlock(g->cur_fn_val, "CastShortenOk");
+ LLVMBasicBlockRef fail_block = LLVMAppendBasicBlock(g->cur_fn_val, "CastShortenFail");
+ LLVMBuildCondBr(g->builder, ok_bit, ok_block, fail_block);
+
+ LLVMPositionBuilderAtEnd(g->builder, fail_block);
+ gen_safety_crash(g, PanicMsgIdCastTruncatedData);
+
+ LLVMPositionBuilderAtEnd(g->builder, ok_block);
+ return nullptr;
+ }
LLVMValueRef trunc_val = LLVMBuildTrunc(g->builder, expr_val, wanted_type->type_ref, "");
if (!want_runtime_safety) {
return trunc_val;