authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-17 19:33:19-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-17 20:48:09-07:00
logfeb4b01b38a13c85a7510a937cbdbede29f21764
treecfc4194a90e21d1a54425dc1676fb31c4f0ea63e
parentb837855317c3f73248e1ea4f3cad6b06d2568443

Sema: fix typeinfo for sentinels of array and pointer


3 files changed, 33 insertions(+), 17 deletions(-)

src/Sema.zig+29-13
......@@ -9640,9 +9640,9 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
96409640 // alignment: comptime_int,
96419641 field_values[1] = try Value.Tag.int_u64.create(sema.arena, ty.abiAlignment(target));
96429642 // is_generic: bool,
9643 field_values[2] = if (info.is_generic) Value.@"true" else Value.@"false";
9643 field_values[2] = Value.makeBool(info.is_generic);
96449644 // is_var_args: bool,
9645 field_values[3] = if (info.is_var_args) Value.@"true" else Value.@"false";
9645 field_values[3] = Value.makeBool(info.is_var_args);
96469646 // return_type: ?type,
96479647 field_values[4] = try Value.Tag.ty.create(sema.arena, ty.fnReturnType());
96489648 // args: []const FnArg,
......@@ -9699,9 +9699,9 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
96999699 // size: Size,
97009700 field_values[0] = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(info.size));
97019701 // is_const: bool,
9702 field_values[1] = if (!info.mutable) Value.@"true" else Value.@"false";
9702 field_values[1] = Value.makeBool(!info.mutable);
97039703 // is_volatile: bool,
9704 field_values[2] = if (info.@"volatile") Value.@"true" else Value.@"false";
9704 field_values[2] = Value.makeBool(info.@"volatile");
97059705 // alignment: comptime_int,
97069706 field_values[3] = try Value.Tag.int_u64.create(sema.arena, alignment);
97079707 // address_space: AddressSpace
......@@ -9709,9 +9709,9 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
97099709 // child: type,
97109710 field_values[5] = try Value.Tag.ty.create(sema.arena, info.pointee_type);
97119711 // is_allowzero: bool,
9712 field_values[6] = if (info.@"allowzero") Value.@"true" else Value.@"false";
9713 // sentinel: anytype,
9714 field_values[7] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.@"null";
9712 field_values[6] = Value.makeBool(info.@"allowzero");
9713 // sentinel: ?*const anyopaque,
9714 field_values[7] = try sema.optRefValue(block, src, info.pointee_type, info.sentinel);
97159715
97169716 return sema.addConstant(
97179717 type_info_ty,
......@@ -9728,8 +9728,8 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
97289728 field_values[0] = try Value.Tag.int_u64.create(sema.arena, info.len);
97299729 // child: type,
97309730 field_values[1] = try Value.Tag.ty.create(sema.arena, info.elem_type);
9731 // sentinel: anytype,
9732 field_values[2] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.@"null";
9731 // sentinel: ?*const anyopaque,
9732 field_values[2] = try sema.optRefValue(block, src, info.elem_type, info.sentinel);
97339733
97349734 return sema.addConstant(
97359735 type_info_ty,
......@@ -9788,7 +9788,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
97889788 var int_tag_type_buffer: Type.Payload.Bits = undefined;
97899789 const int_tag_ty = try ty.intTagType(&int_tag_type_buffer).copy(sema.arena);
97909790
9791 const is_exhaustive = if (ty.isNonexhaustiveEnum()) Value.@"false" else Value.@"true";
9791 const is_exhaustive = Value.makeBool(!ty.isNonexhaustiveEnum());
97929792
97939793 var fields_anon_decl = try block.startAnonDecl(src);
97949794 defer fields_anon_decl.deinit();
......@@ -10050,14 +10050,12 @@ fn typeInfoDecls(
1005010050 break :v try Value.Tag.decl_ref.create(decls_anon_decl.arena(), new_decl);
1005110051 };
1005210052
10053 const is_pub = if (decl.is_pub) Value.@"true" else Value.@"false";
10054
1005510053 const fields = try decls_anon_decl.arena().create([2]Value);
1005610054 fields.* = .{
1005710055 //name: []const u8,
1005810056 name_val,
1005910057 //is_pub: bool,
10060 is_pub,
10058 Value.makeBool(decl.is_pub),
1006110059 };
1006210060 decls_val.* = try Value.Tag.@"struct".create(decls_anon_decl.arena(), fields);
1006310061 }
......@@ -15660,6 +15658,24 @@ fn ensureDeclAnalyzed(sema: *Sema, decl: *Decl) CompileError!void {
1566015658 };
1566115659}
1566215660
15661fn refValue(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type, val: Value) !Value {
15662 var anon_decl = try block.startAnonDecl(src);
15663 defer anon_decl.deinit();
15664 const decl = try anon_decl.finish(
15665 try ty.copy(anon_decl.arena()),
15666 try val.copy(anon_decl.arena()),
15667 );
15668 try sema.mod.declareDeclDependency(sema.owner_decl, decl);
15669 return try Value.Tag.decl_ref.create(sema.arena, decl);
15670}
15671
15672fn optRefValue(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type, opt_val: ?Value) !Value {
15673 const val = opt_val orelse return Value.@"null";
15674 const ptr_val = try refValue(sema, block, src, ty, val);
15675 const result = try Value.Tag.opt_payload.create(sema.arena, ptr_val);
15676 return result;
15677}
15678
1566315679fn analyzeDeclRef(sema: *Sema, decl: *Decl) CompileError!Air.Inst.Ref {
1566415680 try sema.mod.declareDeclDependency(sema.owner_decl, decl);
1566515681 try sema.ensureDeclAnalyzed(decl);
src/value.zig+4
......@@ -3971,6 +3971,10 @@ pub const Value = extern union {
39713971 pub const @"null" = initTag(.null_value);
39723972 pub const @"false" = initTag(.bool_false);
39733973 pub const @"true" = initTag(.bool_true);
3974
3975 pub fn makeBool(x: bool) Value {
3976 return if (x) Value.@"true" else Value.@"false";
3977 }
39743978};
39753979
39763980var negative_one_payload: Value.Payload.I64 = .{
test/behavior/type_info.zig-4
......@@ -103,8 +103,6 @@ fn testUnknownLenPtr() !void {
103103}
104104
105105test "type info: null terminated pointer type info" {
106 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
107
108106 try testNullTerminatedPtr();
109107 comptime try testNullTerminatedPtr();
110108}
......@@ -136,8 +134,6 @@ fn testSlice() !void {
136134}
137135
138136test "type info: array type info" {
139 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
140
141137 try testArray();
142138 comptime try testArray();
143139}