authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-23 17:36:37+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-24 14:43:03+03:00
log3a5148112d4ea8a3650e5163c99b7978c784d0a5
treee298ac7e59e034d0b286ae45ba6de7c5edac7629
parentfdf4c875ffbbeb24f844718d9eb92bac38e7147e

Sema: avoid using `pointerDecl` when dealing with slices

Closes #12885

3 files changed, 50 insertions(+), 13 deletions(-)

src/Sema.zig+13-13
......@@ -17030,14 +17030,14 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1703017030 const payload_val = union_val.val.optionalValue() orelse
1703117031 return sema.addType(Type.initTag(.anyerror));
1703217032 const slice_val = payload_val.castTag(.slice).?.data;
17033 const decl_index = slice_val.ptr.pointerDecl().?;
17034 try sema.ensureDeclAnalyzed(decl_index);
17035 const decl = mod.declPtr(decl_index);
17036 const array_val: []Value = if (decl.val.castTag(.aggregate)) |some| some.data else &.{};
1703717033
17034 const len = try sema.usizeCast(block, src, slice_val.len.toUnsignedInt(mod.getTarget()));
1703817035 var names: Module.ErrorSet.NameMap = .{};
17039 try names.ensureUnusedCapacity(sema.arena, array_val.len);
17040 for (array_val) |elem_val| {
17036 try names.ensureUnusedCapacity(sema.arena, len);
17037 var i: usize = 0;
17038 while (i < len) : (i += 1) {
17039 var buf: Value.ElemValueBuffer = undefined;
17040 const elem_val = slice_val.ptr.elemValueBuffer(mod, i, &buf);
1704117041 const struct_val = elem_val.castTag(.aggregate).?.data;
1704217042 // TODO use reflection instead of magic numbers here
1704317043 // error_set: type,
......@@ -17429,14 +17429,14 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1742917429 var buf: Value.ToTypeBuffer = undefined;
1743017430
1743117431 const args_slice_val = args_val.castTag(.slice).?.data;
17432 const args_decl_index = args_slice_val.ptr.pointerDecl().?;
17433 try sema.ensureDeclAnalyzed(args_decl_index);
17434 const args_decl = mod.declPtr(args_decl_index);
17435 const args: []Value = if (args_decl.val.castTag(.aggregate)) |some| some.data else &.{};
17436 var param_types = try sema.arena.alloc(Type, args.len);
17437 var comptime_params = try sema.arena.alloc(bool, args.len);
17432 const args_len = try sema.usizeCast(block, src, args_slice_val.len.toUnsignedInt(mod.getTarget()));
17433 var param_types = try sema.arena.alloc(Type, args_len);
17434 var comptime_params = try sema.arena.alloc(bool, args_len);
1743817435 var noalias_bits: u32 = 0;
17439 for (args) |arg, i| {
17436 var i: usize = 0;
17437 while (i < args_len) : (i += 1) {
17438 var arg_buf: Value.ElemValueBuffer = undefined;
17439 const arg = args_slice_val.ptr.elemValueBuffer(mod, i, &arg_buf);
1744017440 const arg_val = arg.castTag(.aggregate).?.data;
1744117441 // TODO use reflection instead of magic numbers here
1744217442 // is_generic: bool,
test/behavior.zig+1
......@@ -93,6 +93,7 @@ test {
9393 _ = @import("behavior/bugs/12794.zig");
9494 _ = @import("behavior/bugs/12801-1.zig");
9595 _ = @import("behavior/bugs/12801-2.zig");
96 _ = @import("behavior/bugs/12885.zig");
9697 _ = @import("behavior/bugs/12911.zig");
9798 _ = @import("behavior/bugs/12928.zig");
9899 _ = @import("behavior/byteswap.zig");
test/behavior/bugs/12885.zig created+36
......@@ -0,0 +1,36 @@
1const std = @import("std");
2const builtin = std.builtin;
3const expect = std.testing.expect;
4
5const info = .{
6 .args = [_]builtin.Type.Error{
7 .{ .name = "bar" },
8 },
9};
10const Foo = @Type(.{
11 .ErrorSet = &info.args,
12});
13test "ErrorSet comptime_field_ptr" {
14 if (@import("builtin").zig_backend == .stage1) return error.SkipZigTest;
15
16 try expect(Foo == error{bar});
17}
18
19const fn_info = .{
20 .args = [_]builtin.Type.Fn.Param{
21 .{ .is_generic = false, .is_noalias = false, .arg_type = u8 },
22 },
23};
24const Bar = @Type(.{
25 .Fn = .{
26 .calling_convention = .Unspecified,
27 .alignment = 0,
28 .is_generic = false,
29 .is_var_args = false,
30 .return_type = void,
31 .args = &fn_info.args,
32 },
33});
34test "fn comptime_field_ptr" {
35 try expect(@typeInfo(Bar) == .Fn);
36}