authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-08-17 10:49:17-04:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-08-19 14:09:53+03:00
logd785dc49aa6fc422d936928e504e50a63fa37759
tree5d500a5e4069967b1a80442aa5bc7c3b87358513
parent2129cc5c54e76268177f3d6e8d7598a86496e265

stage2: add error set type equality


2 files changed, 34 insertions(+), 7 deletions(-)

src/type.zig+16-7
...@@ -534,15 +534,24 @@ pub const Type = extern union {...@@ -534,15 +534,24 @@ pub const Type = extern union {
534 return a_data.error_set.eql(b_data.error_set) and a_data.payload.eql(b_data.payload);534 return a_data.error_set.eql(b_data.error_set) and a_data.payload.eql(b_data.payload);
535 },535 },
536 .ErrorSet => {536 .ErrorSet => {
537 const a_is_anyerror = a.tag() == .anyerror;537 if (a.tag() == .anyerror and b.tag() == .anyerror) {
538 const b_is_anyerror = b.tag() == .anyerror;538 return true;
539 }
539540
540 if (a_is_anyerror and b_is_anyerror) return true;541 if (a.tag() == .error_set and b.tag() == .error_set) {
541 if (a_is_anyerror or b_is_anyerror) return false;542 return a.castTag(.error_set).?.data.owner_decl == b.castTag(.error_set).?.data.owner_decl;
543 }
542544
543 std.debug.panic("TODO implement Type equality comparison of {} and {}", .{545 if (a.tag() == .error_set_inferred and b.tag() == .error_set_inferred) {
544 a.tag(), b.tag(),546 return a.castTag(.error_set_inferred).?.data.func == b.castTag(.error_set_inferred).?.data.func;
545 });547 }
548
549 if (a.tag() == .error_set_single and b.tag() == .error_set_single) {
550 const a_data = a.castTag(.error_set_single).?.data;
551 const b_data = b.castTag(.error_set_single).?.data;
552 return std.mem.eql(u8, a_data, b_data);
553 }
554 return false;
546 },555 },
547 .Opaque,556 .Opaque,
548 .Float,557 .Float,
test/cases.zig+18
...@@ -1567,6 +1567,24 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -1567,6 +1567,24 @@ pub fn addCases(ctx: *TestContext) !void {
1567 ":2:20: note: '||' merges error sets; 'or' performs boolean OR",1567 ":2:20: note: '||' merges error sets; 'or' performs boolean OR",
1568 });1568 });
1569 }1569 }
1570 {
1571 var case = ctx.exe("error set equality", linux_x64);
1572
1573 case.addCompareOutput(
1574 \\pub fn main() void {
1575 \\ assert(@TypeOf(error.Foo) == @TypeOf(error.Foo));
1576 \\ assert(@TypeOf(error.Bar) != @TypeOf(error.Foo));
1577 \\ assert(anyerror == anyerror);
1578 \\ assert(error{Foo} != error{Foo});
1579 \\ // TODO put inferred error sets here when @typeInfo works
1580 \\}
1581 \\fn assert(b: bool) void {
1582 \\ if (!b) unreachable;
1583 \\}
1584 ,
1585 "",
1586 );
1587 }
1570 {1588 {
1571 var case = ctx.exe("inline assembly", linux_x64);1589 var case = ctx.exe("inline assembly", linux_x64);
15721590