Commit e36680d3bd

Andrew Kelley <andrew@ziglang.org>
2019-06-19 21:18:51
fix detection of unable to evaluate constant expression
1 parent b588a80
Changed files (3)
src
test
stage1
src/ir.cpp
@@ -8647,7 +8647,7 @@ static ConstExprValue *ir_exec_const_result(CodeGen *codegen, IrExecutable *exec
                 return &codegen->invalid_instruction->value;
             }
             return &value->value;
-        } else if (ir_has_side_effects(instruction)) {
+        } else if (ir_has_side_effects(instruction) && !instr_is_comptime(instruction)) {
             exec_add_error_node(codegen, exec, instruction->source_node,
                     buf_sprintf("unable to evaluate constant expression"));
             return &codegen->invalid_instruction->value;
test/stage1/behavior/cast.zig
@@ -165,10 +165,10 @@ fn castToOptionalSlice() ?[]const u8 {
     return "hi";
 }
 
-//test "implicitly cast from [0]T to anyerror![]T" {
-//    testCastZeroArrayToErrSliceMut();
-//    comptime testCastZeroArrayToErrSliceMut();
-//}
+test "implicitly cast from [0]T to anyerror![]T" {
+    testCastZeroArrayToErrSliceMut();
+    comptime testCastZeroArrayToErrSliceMut();
+}
 
 fn testCastZeroArrayToErrSliceMut() void {
     expect((gimmeErrOrSlice() catch unreachable).len == 0);
@@ -178,20 +178,20 @@ fn gimmeErrOrSlice() anyerror![]u8 {
     return [_]u8{};
 }
 
-//test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" {
-//    {
-//        var data = "hi";
-//        const slice = data[0..];
-//        expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
-//        expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
-//    }
-//    comptime {
-//        var data = "hi";
-//        const slice = data[0..];
-//        expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
-//        expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
-//    }
-//}
+test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" {
+    {
+        var data = "hi";
+        const slice = data[0..];
+        expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
+        expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
+    }
+    comptime {
+        var data = "hi";
+        const slice = data[0..];
+        expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
+        expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
+    }
+}
 fn peerTypeEmptyArrayAndSliceAndError(a: bool, slice: []u8) anyerror![]u8 {
     if (a) {
         return [_]u8{};
test/stage1/behavior.zig
@@ -40,7 +40,7 @@ comptime {
     _ = @import("behavior/bugs/920.zig");
     _ = @import("behavior/byval_arg_var.zig");
     //_ = @import("behavior/cancel.zig");
-    _ = @import("behavior/cast.zig"); // TODO
+    _ = @import("behavior/cast.zig");
     _ = @import("behavior/const_slice_child.zig");
     //_ = @import("behavior/coroutine_await_struct.zig");
     //_ = @import("behavior/coroutines.zig");