-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
no error on invalid try
before anon struct
#21991
Comments
I can reproduce this with const std = @import("std");
test {
const S = struct { a: u8 };
const s: S = try try try try try try try try try try .{ .a = 0 }; // try makes no sense here
try std.testing.expectEqual(0, s.a);
}
pub fn main() void {}
|
This is caused by a combination of two things:
I think this issue indicates that It's still useful to be able to use |
Maybe a naive question but why not disallowing the syntax |
This commit effectively reverts 9e683f0, and hence un-accepts ziglang#19777. While nice in theory, this proposal turned out to have a few problems. Firstly, supplying a result type implicitly coerces the operand to this type -- that's the main point of result types! But for `try`, this is actually a bad idea; we want a redundant `try` to be a compile error, not to silently coerce the non-error value to an error union. In practice, this didn't always happen, because the implementation was buggy anyway; but when it did, it was really quite silly. For instance, `try try ... try .{ ... }` was an accepted expression, with the inner initializer being initially coerced to `E!E!...E!T`. Secondly, the result type inference here didn't play nicely with `return`. If you write `return try`, the operand would actually receive a result type of `E!E!T`, since the `return` gave a result type of `E!T` and the `try` wrapped it in *another* error union. More generally, the problem here is that `try` doesn't know when it should or shouldn't nest error unions. This occasionally broke code which looked like it should work. So, this commit prevents `try` from propagating result types through to its operand. A key motivation for the original proposal here was decl literals; so, as a special case, `try .foo(...)` is still an allowed syntax form, caught by AstGen and specially lowered. This does open the doors to allowing other special cases for decl literals in future, such as `.foo(...) catch ...`, but those proposals are for another time. Resolves: ziglang#21991 Resolves: ziglang#22633
Zig Version
0.14.0-dev.2126+e27b4647d
Steps to Reproduce and Observed Behavior
The compiler doesn't report an error message here and these 3 tests all pass.
I originally noticed this while refactoring some code and forgot to remove
try
from a switch statement, similar to theseExpected Behavior
I would expect an error message like this:
The text was updated successfully, but these errors were encountered: