mlugg 3924f173af compiler: do not propagate result type to try operand
This commit effectively reverts 9e683f0, and hence un-accepts #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: #21991
Resolves: #22633
2025-02-01 15:48:45 +00:00
..
2025-02-01 04:27:24 +01:00
2024-12-19 17:10:03 -05:00
2025-01-29 21:10:20 -08:00
2024-07-23 11:43:12 -07:00
2024-07-09 14:25:42 -07:00
2024-03-10 18:13:30 -07:00
2025-02-01 04:27:24 +01:00
2024-08-22 08:44:08 +02:00
2024-03-21 14:11:46 -07:00
2024-11-01 02:04:27 +03:30
2025-01-29 21:10:20 -08:00
2024-08-07 00:48:32 -07:00
2024-07-31 16:57:42 -07:00
2025-01-16 20:42:08 -05:00
2025-01-16 20:42:08 -05:00
2024-08-29 23:43:52 +01:00
2024-07-09 14:25:42 -07:00
2025-01-20 15:37:57 -06:00
2025-01-16 20:42:08 -05:00