fix detection of unable to evaluate constant expression

This commit is contained in:
Andrew Kelley 2019-06-19 15:18:51 -04:00
parent b588a803bf
commit e36680d3bd
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
3 changed files with 20 additions and 20 deletions

View File

@ -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;

View File

@ -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");

View File

@ -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{};