| author | |
| committer | |
| log | 63f6676fee83883736af794eaddb4d0ccb890c06 |
| tree | f01f8a01902267451d7c8e57de75157e475f1141 |
| parent | 623741171629055a22a35bb8278d81a81dcffbde |
...unsigned integer at compile-time2 files changed, 15 insertions(+), 0 deletions(-)
src/ir.cpp+7| ... | ... | @@ -7053,6 +7053,13 @@ static IrInstruction *ir_analyze_widen_or_shorten(IrAnalyze *ira, IrInstruction |
| 7053 | 7053 | ConstExprValue *val = ir_resolve_const(ira, target, UndefBad); |
| 7054 | 7054 | if (!val) |
| 7055 | 7055 | return ira->codegen->invalid_instruction; |
| 7056 | if (val->data.x_bignum.is_negative && wanted_type->id == TypeTableEntryIdInt && | |
| 7057 | !wanted_type->data.integral.is_signed) | |
| 7058 | { | |
| 7059 | ir_add_error(ira, source_instr, | |
| 7060 | buf_sprintf("attempt to cast negative value to unsigned integer")); | |
| 7061 | return ira->codegen->invalid_instruction; | |
| 7062 | } | |
| 7056 | 7063 | IrInstruction *result = ir_create_const(&ira->new_irb, source_instr->scope, |
| 7057 | 7064 | source_instr->source_node, wanted_type); |
| 7058 | 7065 | result->value = *val; |
test/compile_errors.zig+8| ... | ... | @@ -1801,4 +1801,12 @@ pub fn addCases(cases: &tests.CompileErrorContext) { |
| 1801 | 1801 | \\} |
| 1802 | 1802 | , |
| 1803 | 1803 | ".tmp_source.zig:2:7: error: remainder division with 'i32' and 'i32': signed integers and floats must use @rem or @mod"); |
| 1804 | ||
| 1805 | cases.add("cast negative value to unsigned integer", | |
| 1806 | \\comptime { | |
| 1807 | \\ const value: i32 = -1; | |
| 1808 | \\ const unsigned = u32(value); | |
| 1809 | \\} | |
| 1810 | , | |
| 1811 | ".tmp_source.zig:3:25: error: attempt to cast negative value to unsigned integer"); | |
| 1804 | 1812 | } |