Commit 63f6676fee

Andrew Kelley <superjoe30@gmail.com>
2017-05-10 06:21:27
add compile error for casting negative value to...
...unsigned integer at compile-time
1 parent 6237411
Changed files (2)
src/ir.cpp
@@ -7053,6 +7053,13 @@ static IrInstruction *ir_analyze_widen_or_shorten(IrAnalyze *ira, IrInstruction
         ConstExprValue *val = ir_resolve_const(ira, target, UndefBad);
         if (!val)
             return ira->codegen->invalid_instruction;
+        if (val->data.x_bignum.is_negative && wanted_type->id == TypeTableEntryIdInt &&
+            !wanted_type->data.integral.is_signed)
+        {
+            ir_add_error(ira, source_instr,
+                buf_sprintf("attempt to cast negative value to unsigned integer"));
+            return ira->codegen->invalid_instruction;
+        }
         IrInstruction *result = ir_create_const(&ira->new_irb, source_instr->scope,
                 source_instr->source_node, wanted_type);
         result->value = *val;
test/compile_errors.zig
@@ -1801,4 +1801,12 @@ pub fn addCases(cases: &tests.CompileErrorContext) {
         \\}
     ,
         ".tmp_source.zig:2:7: error: remainder division with 'i32' and 'i32': signed integers and floats must use @rem or @mod");
+
+    cases.add("cast negative value to unsigned integer",
+        \\comptime {
+        \\    const value: i32 = -1;
+        \\    const unsigned = u32(value);
+        \\}
+    ,
+        ".tmp_source.zig:3:25: error: attempt to cast negative value to unsigned integer");
 }