diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-09-17 20:32:51 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-09-17 20:33:42 -0400 |
| commit | bfcfaaf5bd5d2586d815ca5c10009975acf3e514 (patch) | |
| tree | c2a3580527c2fae812a9fc2c2af37679d7e4a33f /src | |
| parent | 15e59eb142af9d4385b9ce5a277df27804e1794e (diff) | |
| download | zig-bfcfaaf5bd5d2586d815ca5c10009975acf3e514.tar.gz zig-bfcfaaf5bd5d2586d815ca5c10009975acf3e514.zip | |
fix codegen for @intCast to u0
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index 090812bbb9..b1915ae45a 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1689,6 +1689,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; |
