Late crash when using inline value as reg argument
Compiling the following program triggers an unfathomable internal error:
fn f(reg u32 x) -> reg u32 {
return x;
}
export
fn main() -> reg u32 {
inline u32 z;
z = 42;
reg u32 r;
r = f(z);
return r;
}
"get_pvar.jazz", line 10 (2-11): internal compilation error in function main: stack allocation: get_Pvar: variable expected Please report
Reported by @cos-imo.
Indeed, stack alloc assumes that every function argument is a variable, and badly fails otherwise. During typing, we reject most programs where it is not the case (r = f(42) is rejected, for instance), but with inline it is possible to pass typing and reach stack alloc with an argument that is not a variable.
I don't know what the proper fix is. Having stack alloc emit a nicer error is easy to do, while detecting this problem during typing seems hard, so I'd fix stack alloc. What do you think?
I think that a checker after type-checking and before compilation should be able to properly address this kind of errors.
In general, do you think that we should remove everything not strictly related to typing from pretyping and put it in that pass?
Precisely. That would also solve issues like #727.