#zig build-exe {
--name test
-Mroot=test.zig
#}

#write test.zig {
pub fn expectError(expected_error: anyerror, actual_error: anyerror!void) !void {
    actual_error catch |err| {
        if (err == expected_error) return {};
    };
    return error.TestExpectedError;
}

fn alwaysErrors() !void { return error.ThisErrorShouldNotAppearInAnyTrace; }
fn foo() !void { return error.Foo; }

pub fn main() !void {
    try expectError(error.ThisErrorShouldNotAppearInAnyTrace, alwaysErrors());
    try expectError(error.ThisErrorShouldNotAppearInAnyTrace, alwaysErrors());
    try expectError(error.Foo, foo());

    // Only the error trace for this failing check should appear:
    try expectError(error.Bar, foo());
}
#}
#update
#check error-trace {
error: TestExpectedError
test.zig:9:18: 0x? in foo (test*)
fn foo() !void { return error.Foo; }
                 ^
test.zig:5:5: 0x? in expectError (test*)
    return error.TestExpectedError;
    ^
test.zig:17:5: 0x? in main (test*)
    try expectError(error.Bar, foo());
    ^
#}
