From fca51c81bc5fd83a3d4a87092696df80790003e9 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 11 Mar 2022 11:53:01 -0800 Subject: [PATCH] stage2: is_non_error always returns comptime true for empty error set --- src/Sema.zig | 9 +++++++++ test/behavior/error.zig | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Sema.zig b/src/Sema.zig index 00553710df..44b2f33d56 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -18144,6 +18144,15 @@ fn analyzeIsNonErr( if (ot != .ErrorSet and ot != .ErrorUnion) return Air.Inst.Ref.bool_true; if (ot == .ErrorSet) return Air.Inst.Ref.bool_false; assert(ot == .ErrorUnion); + + // exception if the error union error set is known to be empty, + // we allow the comparison but always make it comptime known. + const set_ty = operand_ty.errorUnionSet(); + switch (set_ty.tag()) { + .anyerror, .error_set_inferred => {}, + else => if (set_ty.errorSetNames().len == 0) return Air.Inst.Ref.bool_true, + } + const result_ty = Type.bool; if (try sema.resolveMaybeUndefVal(block, src, operand)) |err_union| { if (err_union.isUndef()) { diff --git a/test/behavior/error.zig b/test/behavior/error.zig index 73e03b1c3e..0a55b34121 100644 --- a/test/behavior/error.zig +++ b/test/behavior/error.zig @@ -215,7 +215,11 @@ fn testExplicitErrorSetCast(set1: Set1) !void { } test "comptime test error for empty error set" { - if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO try testComptimeTestErrorEmptySet(1234); comptime try testComptimeTestErrorEmptySet(1234);