authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-08-09 02:15:05-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-11 11:30:51-07:00
log38dfa6537ee4a2042e3a80d2e3020c9059ca16cc
tree9c4c002c3717ca6864b3cfa074c8be3103a88763
parent0b3c3c02e30f61da44d6368cb89e1ecb1afb1399

cbe: emit `nonstring` attribute

Closes #24545

4 files changed, 182 insertions(+), 49 deletions(-)

lib/zig.h+6
......@@ -253,6 +253,12 @@
253253#define zig_align_fn zig_align_fn_unavailable
254254#endif
255255
256#if zig_has_attribute(nonstring)
257#define zig_nonstring __attribute__((nonstring))
258#else
259#define zig_nonstring
260#endif
261
256262#if zig_has_attribute(packed) || defined(zig_tinyc)
257263#define zig_packed(definition) __attribute__((packed)) definition
258264#elif defined(zig_msvc)
src/codegen/c.zig+15-8
......@@ -1316,12 +1316,12 @@ pub const DeclGen = struct {
13161316 try w.writeByte('{');
13171317 var index: usize = 0;
13181318 while (index < ai.len) : (index += 1) {
1319 if (index != 0) try w.writeByte(',');
1319 if (index > 0) try w.writeByte(',');
13201320 const elem_val = try val.elemValue(pt, index);
13211321 try dg.renderValue(w, elem_val, initializer_type);
13221322 }
13231323 if (ai.sentinel) |s| {
1324 if (index != 0) try w.writeByte(',');
1324 if (index > 0) try w.writeByte(',');
13251325 try dg.renderValue(w, s, initializer_type);
13261326 }
13271327 try w.writeByte('}');
......@@ -1854,12 +1854,14 @@ pub const DeclGen = struct {
18541854 .array_type, .vector_type => {
18551855 const ai = ty.arrayInfo(zcu);
18561856 if (ai.elem_type.eql(.u8, zcu)) {
1857 const c_len = ty.arrayLenIncludingSentinel(zcu);
1858 var literal: StringLiteral = .init(w, @intCast(c_len));
1857 var literal: StringLiteral = .init(w, @intCast(ty.arrayLenIncludingSentinel(zcu)));
18591858 try literal.start();
18601859 var index: u64 = 0;
1861 while (index < c_len) : (index += 1)
1862 try literal.writeChar(0xaa);
1860 while (index < ai.len) : (index += 1) try literal.writeChar(0xaa);
1861 if (ai.sentinel) |s| {
1862 const s_u8: u8 = @intCast(s.toUnsignedInt(zcu));
1863 if (s_u8 != 0) try literal.writeChar(s_u8);
1864 }
18631865 return literal.end();
18641866 } else {
18651867 if (!location.isInitializer()) {
......@@ -1869,12 +1871,15 @@ pub const DeclGen = struct {
18691871 }
18701872
18711873 try w.writeByte('{');
1872 const c_len = ty.arrayLenIncludingSentinel(zcu);
18731874 var index: u64 = 0;
1874 while (index < c_len) : (index += 1) {
1875 while (index < ai.len) : (index += 1) {
18751876 if (index > 0) try w.writeAll(", ");
18761877 try dg.renderUndefValue(w, ty.childType(zcu), initializer_type);
18771878 }
1879 if (ai.sentinel) |s| {
1880 if (index > 0) try w.writeAll(", ");
1881 try dg.renderValue(w, s, location);
1882 }
18781883 return w.writeByte('}');
18791884 }
18801885 },
......@@ -2217,6 +2222,7 @@ pub const DeclGen = struct {
22172222 });
22182223 try dg.writeName(w, name);
22192224 try renderTypeSuffix(dg.pass, &dg.ctype_pool, zcu, w, ctype, .suffix, .{});
2225 if (ctype.isNonString(&dg.ctype_pool)) try w.writeAll(" zig_nonstring");
22202226 }
22212227
22222228 fn writeName(dg: *DeclGen, w: *Writer, c_value: CValue) !void {
......@@ -2713,6 +2719,7 @@ fn renderFields(
27132719 );
27142720 try w.print("{f}{f}", .{ trailing, fmtCTypePoolString(field_info.name, ctype_pool, true) });
27152721 try renderTypeSuffix(.flush, ctype_pool, zcu, w, field_info.ctype, .suffix, .{});
2722 if (field_info.ctype.isNonString(ctype_pool)) try w.writeAll(" zig_nonstring");
27162723 try w.writeAll(";\n");
27172724 }
27182725 try w.splatByteAll(' ', indent);
src/codegen/c/Type.zig+160-40
......@@ -177,6 +177,35 @@ pub fn toSignedness(ctype: CType, s: std.builtin.Signedness) CType {
177177 };
178178}
179179
180pub fn isAnyChar(ctype: CType) bool {
181 return switch (ctype.index) {
182 else => false,
183 .char, .@"signed char", .@"unsigned char", .uint8_t, .int8_t => true,
184 };
185}
186
187pub fn isString(ctype: CType, pool: *const Pool) bool {
188 return info: switch (ctype.info(pool)) {
189 .basic, .fwd_decl, .aggregate, .function => false,
190 .pointer => |pointer_info| pointer_info.elem_ctype.isAnyChar(),
191 .aligned => |aligned_info| continue :info aligned_info.ctype.info(pool),
192 .array, .vector => |sequence_info| sequence_info.elem_type.isAnyChar(),
193 };
194}
195
196pub fn isNonString(ctype: CType, pool: *const Pool) bool {
197 var allow_pointer = true;
198 return info: switch (ctype.info(pool)) {
199 .basic, .fwd_decl, .aggregate, .function => false,
200 .pointer => |pointer_info| allow_pointer and pointer_info.nonstring,
201 .aligned => |aligned_info| continue :info aligned_info.ctype.info(pool),
202 .array, .vector => |sequence_info| sequence_info.nonstring or {
203 allow_pointer = false;
204 continue :info sequence_info.elem_ctype.info(pool);
205 },
206 };
207}
208
180209pub fn getStandardDefineAbbrev(ctype: CType) ?[]const u8 {
181210 return switch (ctype.index) {
182211 .char => "CHAR",
......@@ -427,6 +456,15 @@ pub fn info(ctype: CType, pool: *const Pool) Info {
427456 .len = extra.len,
428457 } };
429458 },
459 .nonstring => {
460 var child_info = info(.{ .index = @enumFromInt(item.data) }, pool);
461 switch (child_info) {
462 else => unreachable,
463 .pointer => |*pointer_info| pointer_info.nonstring = true,
464 .array, .vector => |*sequence_info| sequence_info.nonstring = true,
465 }
466 return child_info;
467 },
430468 .fwd_decl_struct_anon => {
431469 const extra_trail = pool.getExtraTrail(Pool.FwdDeclAnon, item.data);
432470 return .{ .fwd_decl = .{
......@@ -601,10 +639,12 @@ fn toForward(ctype: CType, pool: *Pool, allocator: std.mem.Allocator) !CType {
601639 .array => |array_info| pool.getArray(allocator, .{
602640 .elem_ctype = try array_info.elem_ctype.toForward(pool, allocator),
603641 .len = array_info.len,
642 .nonstring = array_info.nonstring,
604643 }),
605644 .vector => |vector_info| pool.getVector(allocator, .{
606645 .elem_ctype = try vector_info.elem_ctype.toForward(pool, allocator),
607646 .len = vector_info.len,
647 .nonstring = vector_info.nonstring,
608648 }),
609649 .aggregate => |aggregate_info| switch (aggregate_info.name) {
610650 .anon => ctype,
......@@ -754,6 +794,7 @@ pub const Info = union(enum) {
754794 elem_ctype: CType,
755795 @"const": bool = false,
756796 @"volatile": bool = false,
797 nonstring: bool = false,
757798
758799 fn tag(pointer_info: Pointer) Pool.Tag {
759800 return @enumFromInt(@intFromEnum(Pool.Tag.pointer) +
......@@ -775,6 +816,7 @@ pub const Info = union(enum) {
775816 pub const Sequence = struct {
776817 elem_ctype: CType,
777818 len: u64,
819 nonstring: bool = false,
778820 };
779821
780822 pub const AggregateTag = enum { @"enum", @"struct", @"union" };
......@@ -878,12 +920,15 @@ pub const Info = union(enum) {
878920 .basic => |lhs_basic_info| lhs_basic_info == rhs_info.basic,
879921 .pointer => |lhs_pointer_info| lhs_pointer_info.@"const" == rhs_info.pointer.@"const" and
880922 lhs_pointer_info.@"volatile" == rhs_info.pointer.@"volatile" and
923 lhs_pointer_info.nonstring == rhs_info.pointer.nonstring and
881924 pool_adapter.eql(lhs_pointer_info.elem_ctype, rhs_info.pointer.elem_ctype),
882925 .aligned => |lhs_aligned_info| std.meta.eql(lhs_aligned_info.alignas, rhs_info.aligned.alignas) and
883926 pool_adapter.eql(lhs_aligned_info.ctype, rhs_info.aligned.ctype),
884927 .array => |lhs_array_info| lhs_array_info.len == rhs_info.array.len and
928 lhs_array_info.nonstring == rhs_info.array.nonstring and
885929 pool_adapter.eql(lhs_array_info.elem_ctype, rhs_info.array.elem_ctype),
886930 .vector => |lhs_vector_info| lhs_vector_info.len == rhs_info.vector.len and
931 lhs_vector_info.nonstring == rhs_info.vector.nonstring and
887932 pool_adapter.eql(lhs_vector_info.elem_ctype, rhs_info.vector.elem_ctype),
888933 .fwd_decl => |lhs_fwd_decl_info| lhs_fwd_decl_info.tag == rhs_info.fwd_decl.tag and
889934 switch (lhs_fwd_decl_info.name) {
......@@ -1063,12 +1108,12 @@ pub const Pool = struct {
10631108 pub fn getPointer(pool: *Pool, allocator: std.mem.Allocator, pointer_info: Info.Pointer) !CType {
10641109 var hasher = Hasher.init;
10651110 hasher.update(pointer_info.elem_ctype.hash(pool));
1066 return pool.tagData(
1111 return pool.getNonString(allocator, try pool.tagData(
10671112 allocator,
10681113 hasher,
10691114 pointer_info.tag(),
10701115 @intFromEnum(pointer_info.elem_ctype.index),
1071 );
1116 ), pointer_info.nonstring);
10721117 }
10731118
10741119 pub fn getAligned(pool: *Pool, allocator: std.mem.Allocator, aligned_info: Info.Aligned) !CType {
......@@ -1079,24 +1124,36 @@ pub const Pool = struct {
10791124 }
10801125
10811126 pub fn getArray(pool: *Pool, allocator: std.mem.Allocator, array_info: Info.Sequence) !CType {
1082 return if (std.math.cast(u32, array_info.len)) |small_len|
1083 pool.tagExtra(allocator, .array_small, SequenceSmall, .{
1127 return pool.getNonString(allocator, if (std.math.cast(u32, array_info.len)) |small_len|
1128 try pool.tagExtra(allocator, .array_small, SequenceSmall, .{
10841129 .elem_ctype = array_info.elem_ctype.index,
10851130 .len = small_len,
10861131 })
10871132 else
1088 pool.tagExtra(allocator, .array_large, SequenceLarge, .{
1133 try pool.tagExtra(allocator, .array_large, SequenceLarge, .{
10891134 .elem_ctype = array_info.elem_ctype.index,
10901135 .len_lo = @truncate(array_info.len >> 0),
10911136 .len_hi = @truncate(array_info.len >> 32),
1092 });
1137 }), array_info.nonstring);
10931138 }
10941139
10951140 pub fn getVector(pool: *Pool, allocator: std.mem.Allocator, vector_info: Info.Sequence) !CType {
1096 return pool.tagExtra(allocator, .vector, SequenceSmall, .{
1141 return pool.getNonString(allocator, try pool.tagExtra(allocator, .vector, SequenceSmall, .{
10971142 .elem_ctype = vector_info.elem_ctype.index,
10981143 .len = @intCast(vector_info.len),
1099 });
1144 }), vector_info.nonstring);
1145 }
1146
1147 pub fn getNonString(
1148 pool: *Pool,
1149 allocator: std.mem.Allocator,
1150 child_ctype: CType,
1151 nonstring: bool,
1152 ) !CType {
1153 if (!nonstring) return child_ctype;
1154 var hasher = Hasher.init;
1155 hasher.update(child_ctype.hash(pool));
1156 return pool.tagData(allocator, hasher, .nonstring, @intFromEnum(child_ctype.index));
11001157 }
11011158
11021159 pub fn getFwdDecl(
......@@ -1314,12 +1371,14 @@ pub const Pool = struct {
13141371 else => {
13151372 const target = &mod.resolved_target.result;
13161373 const abi_align_bytes = std.zig.target.intAlignment(target, int_info.bits);
1374 const limb_ctype = try pool.fromIntInfo(allocator, .{
1375 .signedness = .unsigned,
1376 .bits = @intCast(abi_align_bytes * 8),
1377 }, mod, kind.noParameter());
13171378 const array_ctype = try pool.getArray(allocator, .{
13181379 .len = @divExact(std.zig.target.intByteSize(target, int_info.bits), abi_align_bytes),
1319 .elem_ctype = try pool.fromIntInfo(allocator, .{
1320 .signedness = .unsigned,
1321 .bits = @intCast(abi_align_bytes * 8),
1322 }, mod, kind.noParameter()),
1380 .elem_ctype = limb_ctype,
1381 .nonstring = limb_ctype.isAnyChar(),
13231382 });
13241383 if (!kind.isParameter()) return array_ctype;
13251384 var fields = [_]Info.Field{
......@@ -1402,28 +1461,49 @@ pub const Pool = struct {
14021461 .bits = pt.zcu.errorSetBits(),
14031462 }, mod, kind),
14041463
1405 .ptr_usize_type,
1406 => return pool.getPointer(allocator, .{
1464 .ptr_usize_type => return pool.getPointer(allocator, .{
14071465 .elem_ctype = .usize,
14081466 }),
1409 .ptr_const_comptime_int_type,
1410 => return pool.getPointer(allocator, .{
1467 .ptr_const_comptime_int_type => return pool.getPointer(allocator, .{
14111468 .elem_ctype = .void,
14121469 .@"const" = true,
14131470 }),
1414 .manyptr_u8_type,
1415 => return pool.getPointer(allocator, .{
1471 .manyptr_u8_type => return pool.getPointer(allocator, .{
14161472 .elem_ctype = .u8,
1473 .nonstring = true,
14171474 }),
1418 .manyptr_const_u8_type,
1419 .manyptr_const_u8_sentinel_0_type,
1420 => return pool.getPointer(allocator, .{
1475 .manyptr_const_u8_type => return pool.getPointer(allocator, .{
14211476 .elem_ctype = .u8,
14221477 .@"const" = true,
1478 .nonstring = true,
14231479 }),
1424 .slice_const_u8_type,
1425 .slice_const_u8_sentinel_0_type,
1426 => {
1480 .manyptr_const_u8_sentinel_0_type => return pool.getPointer(allocator, .{
1481 .elem_ctype = .u8,
1482 .@"const" = true,
1483 }),
1484 .slice_const_u8_type => {
1485 const target = &mod.resolved_target.result;
1486 var fields = [_]Info.Field{
1487 .{
1488 .name = .{ .index = .ptr },
1489 .ctype = try pool.getPointer(allocator, .{
1490 .elem_ctype = .u8,
1491 .@"const" = true,
1492 .nonstring = true,
1493 }),
1494 .alignas = AlignAs.fromAbiAlignment(Type.ptrAbiAlignment(target)),
1495 },
1496 .{
1497 .name = .{ .index = .len },
1498 .ctype = .usize,
1499 .alignas = AlignAs.fromAbiAlignment(
1500 .fromByteUnits(std.zig.target.intAlignment(target, target.ptrBitWidth())),
1501 ),
1502 },
1503 };
1504 return pool.fromFields(allocator, .@"struct", &fields, kind);
1505 },
1506 .slice_const_u8_sentinel_0_type => {
14271507 const target = &mod.resolved_target.result;
14281508 var fields = [_]Info.Field{
14291509 .{
......@@ -1449,6 +1529,7 @@ pub const Pool = struct {
14491529 const vector_ctype = try pool.getVector(allocator, .{
14501530 .elem_ctype = .i8,
14511531 .len = 8,
1532 .nonstring = true,
14521533 });
14531534 if (!kind.isParameter()) return vector_ctype;
14541535 var fields = [_]Info.Field{
......@@ -1464,6 +1545,7 @@ pub const Pool = struct {
14641545 const vector_ctype = try pool.getVector(allocator, .{
14651546 .elem_ctype = .i8,
14661547 .len = 16,
1548 .nonstring = true,
14671549 });
14681550 if (!kind.isParameter()) return vector_ctype;
14691551 var fields = [_]Info.Field{
......@@ -1479,6 +1561,7 @@ pub const Pool = struct {
14791561 const vector_ctype = try pool.getVector(allocator, .{
14801562 .elem_ctype = .i8,
14811563 .len = 32,
1564 .nonstring = true,
14821565 });
14831566 if (!kind.isParameter()) return vector_ctype;
14841567 var fields = [_]Info.Field{
......@@ -1494,6 +1577,7 @@ pub const Pool = struct {
14941577 const vector_ctype = try pool.getVector(allocator, .{
14951578 .elem_ctype = .i8,
14961579 .len = 64,
1580 .nonstring = true,
14971581 });
14981582 if (!kind.isParameter()) return vector_ctype;
14991583 var fields = [_]Info.Field{
......@@ -1509,6 +1593,7 @@ pub const Pool = struct {
15091593 const vector_ctype = try pool.getVector(allocator, .{
15101594 .elem_ctype = .u8,
15111595 .len = 1,
1596 .nonstring = true,
15121597 });
15131598 if (!kind.isParameter()) return vector_ctype;
15141599 var fields = [_]Info.Field{
......@@ -1524,6 +1609,7 @@ pub const Pool = struct {
15241609 const vector_ctype = try pool.getVector(allocator, .{
15251610 .elem_ctype = .u8,
15261611 .len = 2,
1612 .nonstring = true,
15271613 });
15281614 if (!kind.isParameter()) return vector_ctype;
15291615 var fields = [_]Info.Field{
......@@ -1539,6 +1625,7 @@ pub const Pool = struct {
15391625 const vector_ctype = try pool.getVector(allocator, .{
15401626 .elem_ctype = .u8,
15411627 .len = 4,
1628 .nonstring = true,
15421629 });
15431630 if (!kind.isParameter()) return vector_ctype;
15441631 var fields = [_]Info.Field{
......@@ -1554,6 +1641,7 @@ pub const Pool = struct {
15541641 const vector_ctype = try pool.getVector(allocator, .{
15551642 .elem_ctype = .u8,
15561643 .len = 8,
1644 .nonstring = true,
15571645 });
15581646 if (!kind.isParameter()) return vector_ctype;
15591647 var fields = [_]Info.Field{
......@@ -1569,6 +1657,7 @@ pub const Pool = struct {
15691657 const vector_ctype = try pool.getVector(allocator, .{
15701658 .elem_ctype = .u8,
15711659 .len = 16,
1660 .nonstring = true,
15721661 });
15731662 if (!kind.isParameter()) return vector_ctype;
15741663 var fields = [_]Info.Field{
......@@ -1584,6 +1673,7 @@ pub const Pool = struct {
15841673 const vector_ctype = try pool.getVector(allocator, .{
15851674 .elem_ctype = .u8,
15861675 .len = 32,
1676 .nonstring = true,
15871677 });
15881678 if (!kind.isParameter()) return vector_ctype;
15891679 var fields = [_]Info.Field{
......@@ -1599,6 +1689,7 @@ pub const Pool = struct {
15991689 const vector_ctype = try pool.getVector(allocator, .{
16001690 .elem_ctype = .u8,
16011691 .len = 64,
1692 .nonstring = true,
16021693 });
16031694 if (!kind.isParameter()) return vector_ctype;
16041695 var fields = [_]Info.Field{
......@@ -2225,6 +2316,11 @@ pub const Pool = struct {
22252316 .function => false,
22262317 },
22272318 .@"volatile" = ptr_info.flags.is_volatile,
2319 .nonstring = elem_ctype.isAnyChar() and switch (ptr_info.sentinel) {
2320 .none => true,
2321 .zero_u8 => false,
2322 else => |sentinel| Value.fromInterned(sentinel).orderAgainstZero(zcu).compare(.neq),
2323 },
22282324 });
22292325 },
22302326 .slice => {
......@@ -2269,6 +2365,11 @@ pub const Pool = struct {
22692365 const array_ctype = try pool.getArray(allocator, .{
22702366 .elem_ctype = elem_ctype,
22712367 .len = len,
2368 .nonstring = elem_ctype.isAnyChar() and switch (array_info.sentinel) {
2369 .none => true,
2370 .zero_u8 => false,
2371 else => |sentinel| Value.fromInterned(sentinel).orderAgainstZero(zcu).compare(.neq),
2372 },
22722373 });
22732374 if (!kind.isParameter()) return array_ctype;
22742375 var fields = [_]Info.Field{
......@@ -2295,6 +2396,7 @@ pub const Pool = struct {
22952396 const vector_ctype = try pool.getVector(allocator, .{
22962397 .elem_ctype = elem_ctype,
22972398 .len = vector_info.len,
2399 .nonstring = elem_ctype.isAnyChar(),
22982400 });
22992401 if (!kind.isParameter()) return vector_ctype;
23002402 var fields = [_]Info.Field{
......@@ -2773,9 +2875,17 @@ pub const Pool = struct {
27732875 const ctype: CType = .fromPoolIndex(gop.index);
27742876 if (!gop.found_existing) switch (source_info) {
27752877 .basic => unreachable,
2776 .pointer => |pointer_info| pool.items.appendAssumeCapacity(.{
2777 .tag = tag,
2778 .data = @intFromEnum(pool_adapter.copy(pointer_info.elem_ctype).index),
2878 .pointer => |pointer_info| pool.items.appendAssumeCapacity(switch (pointer_info.nonstring) {
2879 false => .{
2880 .tag = tag,
2881 .data = @intFromEnum(pool_adapter.copy(pointer_info.elem_ctype).index),
2882 },
2883 true => .{
2884 .tag = .nonstring,
2885 .data = @intFromEnum(pool_adapter.copy(.{ .index = @enumFromInt(
2886 source_pool.items.items(.data)[source_ctype.toPoolIndex().?],
2887 ) }).index),
2888 },
27792889 }),
27802890 .aligned => |aligned_info| pool.items.appendAssumeCapacity(.{
27812891 .tag = tag,
......@@ -2784,19 +2894,27 @@ pub const Pool = struct {
27842894 .flags = .{ .alignas = aligned_info.alignas },
27852895 }, 0),
27862896 }),
2787 .array, .vector => |sequence_info| pool.items.appendAssumeCapacity(.{
2788 .tag = tag,
2789 .data = switch (tag) {
2790 .array_small, .vector => try pool.addExtra(allocator, SequenceSmall, .{
2791 .elem_ctype = pool_adapter.copy(sequence_info.elem_ctype).index,
2792 .len = @intCast(sequence_info.len),
2793 }, 0),
2794 .array_large => try pool.addExtra(allocator, SequenceLarge, .{
2795 .elem_ctype = pool_adapter.copy(sequence_info.elem_ctype).index,
2796 .len_lo = @truncate(sequence_info.len >> 0),
2797 .len_hi = @truncate(sequence_info.len >> 32),
2798 }, 0),
2799 else => unreachable,
2897 .array, .vector => |sequence_info| pool.items.appendAssumeCapacity(switch (sequence_info.nonstring) {
2898 false => .{
2899 .tag = tag,
2900 .data = switch (tag) {
2901 .array_small, .vector => try pool.addExtra(allocator, SequenceSmall, .{
2902 .elem_ctype = pool_adapter.copy(sequence_info.elem_ctype).index,
2903 .len = @intCast(sequence_info.len),
2904 }, 0),
2905 .array_large => try pool.addExtra(allocator, SequenceLarge, .{
2906 .elem_ctype = pool_adapter.copy(sequence_info.elem_ctype).index,
2907 .len_lo = @truncate(sequence_info.len >> 0),
2908 .len_hi = @truncate(sequence_info.len >> 32),
2909 }, 0),
2910 else => unreachable,
2911 },
2912 },
2913 true => .{
2914 .tag = .nonstring,
2915 .data = @intFromEnum(pool_adapter.copy(.{ .index = @enumFromInt(
2916 source_pool.items.items(.data)[source_ctype.toPoolIndex().?],
2917 ) }).index),
28002918 },
28012919 }),
28022920 .fwd_decl => |fwd_decl_info| switch (fwd_decl_info.name) {
......@@ -3068,6 +3186,7 @@ pub const Pool = struct {
30683186 array_small,
30693187 array_large,
30703188 vector,
3189 nonstring,
30713190 fwd_decl_struct_anon,
30723191 fwd_decl_union_anon,
30733192 fwd_decl_struct,
......@@ -3283,4 +3402,5 @@ const CType = @This();
32833402const InternPool = @import("../../InternPool.zig");
32843403const Module = @import("../../Package/Module.zig");
32853404const Type = @import("../../Type.zig");
3405const Value = @import("../../Value.zig");
32863406const Zcu = @import("../../Zcu.zig");
test/behavior/x86_64/binary.zig+1-1
......@@ -1912,7 +1912,7 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
19121912 -0x1,
19131913 });
19141914 try testArgs(@Vector(2, i1), .{
1915 0x0, 0x00,
1915 0x0, 0x0,
19161916 }, .{
19171917 -0x1, -0x1,
19181918 });