mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
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.
24 lines
356 B
Text
24 lines
356 B
Text
fun alwaysThrows(): never {
|
|
throw 456;
|
|
}
|
|
|
|
fun testUnreachable(x: int) {
|
|
if (x) { throw 123; }
|
|
else { alwaysThrows(); }
|
|
return 1;
|
|
}
|
|
|
|
fun main() {
|
|
try {
|
|
testUnreachable(100);
|
|
throw 80;
|
|
} catch (excNo) {
|
|
return excNo;
|
|
}
|
|
}
|
|
|
|
/**
|
|
@testcase | 0 | | 123
|
|
@stderr warning: unreachable code
|
|
@stderr return 1;
|
|
*/
|