Skip to content

Commit c38724a

Browse files
committed
test/behavior/cast: check error-set membership not @typeinfo order
Under parallel sema, error-name InternPool indices (and thus the index-sorted @typeinfo order) depend on which thread interns first. The language does not specify error-set @typeinfo ordering; check membership instead.
1 parent d05d437 commit c38724a

File tree

2 files changed

+36
-24
lines changed

2 files changed

+36
-24
lines changed

test/behavior/cast.zig

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ const mem = std.mem;
88
const maxInt = std.math.maxInt;
99
const native_endian = builtin.target.cpu.arch.endian();
1010

11+
fn errorSetContains(set: []const std.builtin.Type.Error, name: []const u8) bool {
12+
for (set) |e| if (mem.eql(u8, e.name, name)) return true;
13+
return false;
14+
}
15+
1116
test "int to ptr cast" {
1217
if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1318

@@ -885,8 +890,8 @@ test "peer type resolution: error set supersets" {
885890
const error_set_info = @typeInfo(ty);
886891
try expect(error_set_info == .error_set);
887892
try expect(error_set_info.error_set.?.len == 2);
888-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
889-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
893+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
894+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
890895
}
891896

892897
// B superset of A
@@ -895,8 +900,8 @@ test "peer type resolution: error set supersets" {
895900
const error_set_info = @typeInfo(ty);
896901
try expect(error_set_info == .error_set);
897902
try expect(error_set_info.error_set.?.len == 2);
898-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
899-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
903+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
904+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
900905
}
901906
}
902907

@@ -913,19 +918,19 @@ test "peer type resolution: disjoint error sets" {
913918
const error_set_info = @typeInfo(ty);
914919
try expect(error_set_info == .error_set);
915920
try expect(error_set_info.error_set.?.len == 3);
916-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
917-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
918-
try expect(mem.eql(u8, error_set_info.error_set.?[2].name, "Three"));
921+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
922+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
923+
try expect(errorSetContains(error_set_info.error_set.?, "Three"));
919924
}
920925

921926
{
922927
const ty = @TypeOf(b, a);
923928
const error_set_info = @typeInfo(ty);
924929
try expect(error_set_info == .error_set);
925930
try expect(error_set_info.error_set.?.len == 3);
926-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
927-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
928-
try expect(mem.eql(u8, error_set_info.error_set.?[2].name, "Three"));
931+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
932+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
933+
try expect(errorSetContains(error_set_info.error_set.?, "Three"));
929934
}
930935
}
931936

@@ -944,9 +949,9 @@ test "peer type resolution: error union and error set" {
944949

945950
const error_set_info = @typeInfo(info.error_union.error_set);
946951
try expect(error_set_info.error_set.?.len == 3);
947-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
948-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
949-
try expect(mem.eql(u8, error_set_info.error_set.?[2].name, "Three"));
952+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
953+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
954+
try expect(errorSetContains(error_set_info.error_set.?, "Three"));
950955
}
951956

952957
{
@@ -956,9 +961,9 @@ test "peer type resolution: error union and error set" {
956961

957962
const error_set_info = @typeInfo(info.error_union.error_set);
958963
try expect(error_set_info.error_set.?.len == 3);
959-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
960-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
961-
try expect(mem.eql(u8, error_set_info.error_set.?[2].name, "Three"));
964+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
965+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
966+
try expect(errorSetContains(error_set_info.error_set.?, "Three"));
962967
}
963968
}
964969

@@ -978,8 +983,8 @@ test "peer type resolution: error union after non-error" {
978983

979984
const error_set_info = @typeInfo(info.error_union.error_set);
980985
try expect(error_set_info.error_set.?.len == 2);
981-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
982-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
986+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
987+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
983988
}
984989

985990
{
@@ -990,8 +995,8 @@ test "peer type resolution: error union after non-error" {
990995

991996
const error_set_info = @typeInfo(info.error_union.error_set);
992997
try expect(error_set_info.error_set.?.len == 2);
993-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
994-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
998+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
999+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
9951000
}
9961001
}
9971002

test/behavior/type_info.zig

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ const assert = std.debug.assert;
99
const expect = std.testing.expect;
1010
const expectEqualStrings = std.testing.expectEqualStrings;
1111

12+
fn errorSetContains(set: []const Type.Error, name: []const u8) bool {
13+
for (set) |e| if (mem.eql(u8, e.name, name)) return true;
14+
return false;
15+
}
16+
1217
test "type info: integer, floating point type info" {
1318
try testIntFloat();
1419
try comptime testIntFloat();
@@ -176,7 +181,9 @@ fn testErrorSet() !void {
176181
const error_set_info = @typeInfo(TestErrorSet);
177182
try expect(error_set_info == .error_set);
178183
try expect(error_set_info.error_set.?.len == 3);
179-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "First"));
184+
try expect(errorSetContains(error_set_info.error_set.?, "First"));
185+
try expect(errorSetContains(error_set_info.error_set.?, "Second"));
186+
try expect(errorSetContains(error_set_info.error_set.?, "Third"));
180187

181188
const error_union_info = @typeInfo(TestErrorSet!usize);
182189
try expect(error_union_info == .error_union);
@@ -211,9 +218,9 @@ test "type info: error set merged" {
211218
const error_set_info = @typeInfo(TestSet);
212219
try expect(error_set_info == .error_set);
213220
try expect(error_set_info.error_set.?.len == 3);
214-
try expect(mem.eql(u8, error_set_info.error_set.?[0].name, "One"));
215-
try expect(mem.eql(u8, error_set_info.error_set.?[1].name, "Two"));
216-
try expect(mem.eql(u8, error_set_info.error_set.?[2].name, "Three"));
221+
try expect(errorSetContains(error_set_info.error_set.?, "One"));
222+
try expect(errorSetContains(error_set_info.error_set.?, "Two"));
223+
try expect(errorSetContains(error_set_info.error_set.?, "Three"));
217224
}
218225

219226
test "type info: enum info" {

0 commit comments

Comments
 (0)