mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
[Tolk] throw
interrupts control flow; never
type
In FunC (and in Tolk before) throwing an exception is just calling a built-in function: > throw 123; // actually, __throw(123) Since it's a regular function, the compiler was not aware that execution will stop, and all following code is unreachable. For instance, `throw` in the end on function needed to be followed by `return` statement. Now, `throw` interrupts control flow, all statements after it are considered unreachable. At IR level, code Ops are also not produced. This works because a built-in __throw() now has `never` type. It can also be applied to custom functions: > fun alwaysThrow(): never { throw 123; } The code after alwaysThrow() call will also be unreachable.
This commit is contained in:
parent
7bcb8b895f
commit
ef0328837f
10 changed files with 227 additions and 25 deletions
|
@ -86,6 +86,17 @@ fun test7() {
|
|||
// __expect_type(eq<(int, slice)>, "(int, slice) -> (int, slice)");
|
||||
}
|
||||
|
||||
fun alwaysThrows(): never { throw 123; }
|
||||
fun alwaysThrowsNotAnnotated() { throw 123; }
|
||||
fun alwaysThrowsNotAnnotated2() { alwaysThrows(); }
|
||||
|
||||
fun test9() {
|
||||
__expect_type(alwaysThrows(), "never");
|
||||
__expect_type(alwaysThrows, "() -> never");
|
||||
__expect_type(alwaysThrowsNotAnnotated(), "void");
|
||||
__expect_type(alwaysThrowsNotAnnotated2(), "void");
|
||||
}
|
||||
|
||||
|
||||
fun main() {
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue