Consider:
----------------------------
import core.stdc.stdlib;
void fun() nothrow;
struct B {
int* p;
size_t x;
}
size_t fun4(ref B a) {
B b;
scope (exit) free(b.p);
fun();
return b.x + a.x;
}
----------------------------
This current sets up an exception handler to call free(b.p), even though no exceptions can be thrown. Instead, the code rewrite should be:
---------------------
size_t fun4(ref B a) {
B b;
fun();
auto tmp = b.x + a.x;
free(b.p);
return tmp;
}
-----------------------
This will result in significant performance improvements. Currently, only one such rewrite case is handled in TryFinallyStatement::semantic(). There's more low hanging fruit, such as the return statement case above, that should be handled there.
(scope-statements are rewritten as try-finally-statements.)