| ... | @@ -1535,9 +1535,11 @@ static LLVMValueRef gen_widen_or_shorten(CodeGen *g, bool want_runtime_safety, Z | ... | @@ -1535,9 +1535,11 @@ static LLVMValueRef gen_widen_or_shorten(CodeGen *g, bool want_runtime_safety, Z |
| 1535 | zig_unreachable(); | 1535 | zig_unreachable(); |
| 1536 | } | 1536 | } |
| 1537 | | 1537 | |
| 1538 | if (actual_type->id == ZigTypeIdInt && | 1538 | if (actual_type->id == ZigTypeIdInt && want_runtime_safety && ( |
| 1539 | !wanted_type->data.integral.is_signed && actual_type->data.integral.is_signed && | 1539 | // negative to unsigned |
| 1540 | want_runtime_safety) | 1540 | (!wanted_type->data.integral.is_signed && actual_type->data.integral.is_signed) || |
| | 1541 | // unsigned would become negative |
| | 1542 | (wanted_type->data.integral.is_signed && !actual_type->data.integral.is_signed && actual_bits == wanted_bits))) |
| 1541 | { | 1543 | { |
| 1542 | LLVMValueRef zero = LLVMConstNull(get_llvm_type(g, actual_type)); | 1544 | LLVMValueRef zero = LLVMConstNull(get_llvm_type(g, actual_type)); |
| 1543 | LLVMValueRef ok_bit = LLVMBuildICmp(g->builder, LLVMIntSGE, expr_val, zero, ""); | 1545 | LLVMValueRef ok_bit = LLVMBuildICmp(g->builder, LLVMIntSGE, expr_val, zero, ""); |
| ... | @@ -1547,7 +1549,7 @@ static LLVMValueRef gen_widen_or_shorten(CodeGen *g, bool want_runtime_safety, Z | ... | @@ -1547,7 +1549,7 @@ static LLVMValueRef gen_widen_or_shorten(CodeGen *g, bool want_runtime_safety, Z |
| 1547 | LLVMBuildCondBr(g->builder, ok_bit, ok_block, fail_block); | 1549 | LLVMBuildCondBr(g->builder, ok_bit, ok_block, fail_block); |
| 1548 | | 1550 | |
| 1549 | LLVMPositionBuilderAtEnd(g->builder, fail_block); | 1551 | LLVMPositionBuilderAtEnd(g->builder, fail_block); |
| 1550 | gen_safety_crash(g, PanicMsgIdCastNegativeToUnsigned); | 1552 | gen_safety_crash(g, actual_type->data.integral.is_signed ? PanicMsgIdCastNegativeToUnsigned : PanicMsgIdCastTruncatedData); |
| 1551 | | 1553 | |
| 1552 | LLVMPositionBuilderAtEnd(g->builder, ok_block); | 1554 | LLVMPositionBuilderAtEnd(g->builder, ok_block); |
| 1553 | } | 1555 | } |