zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit e36680d3bd08fceb3e976edeafae60ce6d577342 (tree)
parent b588a803bf4493d2fd1892fe172b9ce8cfb0ca30
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Wed, 19 Jun 2019 15:18:51 -0400

fix detection of unable to evaluate constant expression

Diffstat:
Msrc/ir.cpp | 2+-
Mtest/stage1/behavior.zig | 2+-
Mtest/stage1/behavior/cast.zig | 36++++++++++++++++++------------------
3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/src/ir.cpp b/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; diff --git a/test/stage1/behavior.zig b/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"); diff --git a/test/stage1/behavior/cast.zig b/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{};