authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-19 15:18:51-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-19 15:18:51-04:00
loge36680d3bd08fceb3e976edeafae60ce6d577342
tree60ca93229fabd17136dd6aa2389ba9d2c95ed6b7
parentb588a803bf4493d2fd1892fe172b9ce8cfb0ca30
signaturelock-open Commit is signed but in an unrecognized format.

fix detection of unable to evaluate constant expression


3 files changed, 20 insertions(+), 20 deletions(-)

src/ir.cpp+1-1
......@@ -8647,7 +8647,7 @@ static ConstExprValue *ir_exec_const_result(CodeGen *codegen, IrExecutable *exec
86478647 return &codegen->invalid_instruction->value;
86488648 }
86498649 return &value->value;
8650 } else if (ir_has_side_effects(instruction)) {
8650 } else if (ir_has_side_effects(instruction) && !instr_is_comptime(instruction)) {
86518651 exec_add_error_node(codegen, exec, instruction->source_node,
86528652 buf_sprintf("unable to evaluate constant expression"));
86538653 return &codegen->invalid_instruction->value;
test/stage1/behavior.zig+1-1
......@@ -40,7 +40,7 @@ comptime {
4040 _ = @import("behavior/bugs/920.zig");
4141 _ = @import("behavior/byval_arg_var.zig");
4242 //_ = @import("behavior/cancel.zig");
43 _ = @import("behavior/cast.zig"); // TODO
43 _ = @import("behavior/cast.zig");
4444 _ = @import("behavior/const_slice_child.zig");
4545 //_ = @import("behavior/coroutine_await_struct.zig");
4646 //_ = @import("behavior/coroutines.zig");
test/stage1/behavior/cast.zig+18-18
......@@ -165,10 +165,10 @@ fn castToOptionalSlice() ?[]const u8 {
165165 return "hi";
166166}
167167
168//test "implicitly cast from [0]T to anyerror![]T" {
169// testCastZeroArrayToErrSliceMut();
170// comptime testCastZeroArrayToErrSliceMut();
171//}
168test "implicitly cast from [0]T to anyerror![]T" {
169 testCastZeroArrayToErrSliceMut();
170 comptime testCastZeroArrayToErrSliceMut();
171}
172172
173173fn testCastZeroArrayToErrSliceMut() void {
174174 expect((gimmeErrOrSlice() catch unreachable).len == 0);
......@@ -178,20 +178,20 @@ fn gimmeErrOrSlice() anyerror![]u8 {
178178 return [_]u8{};
179179}
180180
181//test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" {
182// {
183// var data = "hi";
184// const slice = data[0..];
185// expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
186// expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
187// }
188// comptime {
189// var data = "hi";
190// const slice = data[0..];
191// expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
192// expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
193// }
194//}
181test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" {
182 {
183 var data = "hi";
184 const slice = data[0..];
185 expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
186 expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
187 }
188 comptime {
189 var data = "hi";
190 const slice = data[0..];
191 expect((try peerTypeEmptyArrayAndSliceAndError(true, slice)).len == 0);
192 expect((try peerTypeEmptyArrayAndSliceAndError(false, slice)).len == 1);
193 }
194}
195195fn peerTypeEmptyArrayAndSliceAndError(a: bool, slice: []u8) anyerror![]u8 {
196196 if (a) {
197197 return [_]u8{};