戻り値の型推論

rowlはC言語風の構文にしたいと思っている。例えば

if (...) {
   ...
};

の様にelse節を持たないif文を定義することもできるようにしたい。また値もreturnを使って返すようにしたい。
この場合、例えば

f: (a,b,c) {
    if (a > 0) {
        return b;
    };
    return c;
};

みたいな関数はbとcの型が同じで、さらにそれが関数の戻り値の型と一致する事が分からなければならない。
で、最初は制御フローとか調べなきゃならないかと思ったけど、

return expr  →  retval = expr;

の様にreturn文をretval等の仮想的な変数への代入文だと思って、ブロック内のすべてのstatementはvoid型であるとすれば問題なく解析できる事に気づいた。
return文以外で関数を抜ける場合(関数末尾・例外)にはそこにreturn;という文があると思って解析すれば良い。