From 6c51c8e131b0bad77f199176dfc186b92768f296 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 28 Jun 2022 16:35:58 -0700 Subject: Sema: fix not propagating want_safety in zirBlock Before this commit, `@setRuntimeSafety()` has no effect inside an if expression. --- src/Sema.zig | 1 + 1 file changed, 1 insertion(+) (limited to 'src/Sema.zig') diff --git a/src/Sema.zig b/src/Sema.zig index 798dc06db1..2d2c303586 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -4478,6 +4478,7 @@ fn zirBlock(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileErro .label = &label, .inlining = parent_block.inlining, .is_comptime = parent_block.is_comptime, + .want_safety = parent_block.want_safety, }; defer child_block.instructions.deinit(gpa); -- cgit v1.2.3 From c3ae909e935f1548408f2e400464370ee02b7e82 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 28 Jun 2022 17:56:28 -0700 Subject: Revert "AstGen: preserve inferred ptr result loc for breaks" This reverts commit 8bf3e1f8d0902abd4133e2729b3625c25011c3ff, which introduced miscompilations for peer expressions any time they needed coercions to runtime types. I opened #11957 as a proposal to accomplish the goal of the reverted commit. Closes #11898 --- lib/std/priority_queue.zig | 15 --------------- src/AstGen.zig | 2 +- src/Sema.zig | 22 ---------------------- test/behavior/basic.zig | 12 ------------ test/behavior/cast.zig | 2 ++ test/behavior/error.zig | 2 +- test/behavior/if.zig | 17 +++++++++++++++++ 7 files changed, 21 insertions(+), 51 deletions(-) (limited to 'src/Sema.zig') diff --git a/lib/std/priority_queue.zig b/lib/std/priority_queue.zig index 1a52fda5be..ebc13a9974 100644 --- a/lib/std/priority_queue.zig +++ b/lib/std/priority_queue.zig @@ -286,7 +286,6 @@ const PQlt = PriorityQueue(u32, void, lessThan); const PQgt = PriorityQueue(u32, void, greaterThan); test "std.PriorityQueue: add and remove min heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); @@ -305,7 +304,6 @@ test "std.PriorityQueue: add and remove min heap" { } test "std.PriorityQueue: add and remove same min heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); @@ -355,7 +353,6 @@ test "std.PriorityQueue: peek" { } test "std.PriorityQueue: sift up with odd indices" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; @@ -370,7 +367,6 @@ test "std.PriorityQueue: sift up with odd indices" { } test "std.PriorityQueue: addSlice" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; @@ -403,7 +399,6 @@ test "std.PriorityQueue: fromOwnedSlice trivial case 1" { } test "std.PriorityQueue: fromOwnedSlice" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; const heap_items = try testing.allocator.dupe(u32, items[0..]); var queue = PQlt.fromOwnedSlice(testing.allocator, heap_items[0..], {}); @@ -416,7 +411,6 @@ test "std.PriorityQueue: fromOwnedSlice" { } test "std.PriorityQueue: add and remove max heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQgt.init(testing.allocator, {}); defer queue.deinit(); @@ -435,7 +429,6 @@ test "std.PriorityQueue: add and remove max heap" { } test "std.PriorityQueue: add and remove same max heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQgt.init(testing.allocator, {}); defer queue.deinit(); @@ -476,7 +469,6 @@ test "std.PriorityQueue: iterator" { } test "std.PriorityQueue: remove at index" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); @@ -512,7 +504,6 @@ test "std.PriorityQueue: iterator while empty" { } test "std.PriorityQueue: shrinkAndFree" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); @@ -536,7 +527,6 @@ test "std.PriorityQueue: shrinkAndFree" { } test "std.PriorityQueue: update min heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); @@ -552,7 +542,6 @@ test "std.PriorityQueue: update min heap" { } test "std.PriorityQueue: update same min heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); @@ -569,7 +558,6 @@ test "std.PriorityQueue: update same min heap" { } test "std.PriorityQueue: update max heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQgt.init(testing.allocator, {}); defer queue.deinit(); @@ -585,7 +573,6 @@ test "std.PriorityQueue: update max heap" { } test "std.PriorityQueue: update same max heap" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQgt.init(testing.allocator, {}); defer queue.deinit(); @@ -602,7 +589,6 @@ test "std.PriorityQueue: update same max heap" { } test "std.PriorityQueue: siftUp in remove" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO var queue = PQlt.init(testing.allocator, {}); defer queue.deinit(); @@ -623,7 +609,6 @@ fn contextLessThan(context: []const u32, a: usize, b: usize) Order { const CPQlt = PriorityQueue(usize, []const u32, contextLessThan); test "std.PriorityQueue: add and remove min heap with contextful comparator" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO const context = [_]u32{ 5, 3, 4, 2, 2, 8, 0 }; var queue = CPQlt.init(testing.allocator, context[0..]); diff --git a/src/AstGen.zig b/src/AstGen.zig index 078523831c..ec8af65614 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -10007,7 +10007,7 @@ const GenZir = struct { .inferred_ptr => |ptr| { gz.rl_ty_inst = .none; gz.rl_ptr = ptr; - gz.break_result_loc = parent_rl; + gz.break_result_loc = .{ .block_ptr = gz }; }, .block_ptr => |parent_block_scope| { diff --git a/src/Sema.zig b/src/Sema.zig index 2d2c303586..159574e3d5 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3079,28 +3079,6 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com if (var_is_mut) { try sema.validateVarType(block, ty_src, final_elem_ty, false); - - // The value might have been bitcasted into a comptime only - // pointer type such as `*@Type(.EnumLiteral)` so we must now - // update all the stores to not give backends invalid AIR. - - var air_tags = sema.air_instructions.items(.tag); - var air_data = sema.air_instructions.items(.data); - var peer_inst_index: usize = 0; - var i = ptr_inst; - while (i < air_tags.len and peer_inst_index < peer_inst_list.len) : (i += 1) { - if (air_tags[i] != .store) continue; - if (air_data[i].bin_op.rhs == peer_inst_list[peer_inst_index]) { - peer_inst_index += 1; - _ = (try sema.resolveMaybeUndefVal(block, .unneeded, air_data[i].bin_op.rhs)) orelse continue; - const coerced_val = try sema.coerce(block, final_elem_ty, air_data[i].bin_op.rhs, .unneeded); - air_tags = sema.air_instructions.items(.tag); - air_data = sema.air_instructions.items(.data); - - air_data[i].bin_op.lhs = ptr; - air_data[i].bin_op.rhs = coerced_val; - } - } } else ct: { // Detect if the value is comptime known. In such case, the // last 3 AIR instructions of the block will look like this: diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index d288d35787..8241579229 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -928,18 +928,6 @@ test "try in labeled block doesn't cast to wrong type" { _ = s; } -test "comptime int in switch in catch is casted to correct inferred type" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - - var a: error{ A, B }!u64 = 0; - var b = a catch |err| switch (err) { - error.A => 0, - else => unreachable, - }; - _ = b; -} - test "vector initialized with array init syntax has proper type" { comptime { const actual = -@Vector(4, i32){ 1, 2, 3, 4 }; diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index c980de8e8a..7064b5abdc 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -812,6 +812,7 @@ test "peer type resolution: error union after non-error" { } test "peer cast *[0]T to E![]const T" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO @@ -826,6 +827,7 @@ test "peer cast *[0]T to E![]const T" { } test "peer cast *[0]T to []const T" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO diff --git a/test/behavior/error.zig b/test/behavior/error.zig index c32ca6f6a1..0e3767a4ca 100644 --- a/test/behavior/error.zig +++ b/test/behavior/error.zig @@ -709,7 +709,7 @@ test "simple else prong allowed even when all errors handled" { } }; var value = S.foo() catch |err| switch (err) { - error.Foo => 255, + error.Foo => @as(u8, 255), else => |e| return e, }; try expect(value == 255); diff --git a/test/behavior/if.zig b/test/behavior/if.zig index d59a974ce4..a78bf74502 100644 --- a/test/behavior/if.zig +++ b/test/behavior/if.zig @@ -111,3 +111,20 @@ test "if prongs cast to expected type instead of peer type resolution" { try S.doTheTest(false); comptime try S.doTheTest(false); } + +test "if peer expressions inferred optional type" { + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + + var self: []const u8 = "abcdef"; + var index: usize = 0; + var left_index = (index << 1) + 1; + var right_index = left_index + 1; + var left = if (left_index < self.len) self[left_index] else null; + var right = if (right_index < self.len) self[right_index] else null; + try expect(left_index < self.len); + try expect(right_index < self.len); + try expect(left.? == 98); + try expect(right.? == 99); +} -- cgit v1.2.3