Conformity checks only have an afterguard, we want to combine this afterguard with guard so that we have a single primitive function, instead of having almost the same thing twice.
Additionally, similarly to type patterns, we want this guard to occur both before and after the conformity checked code so that we can keep the context in the future if we have better error messages.
Something like:
p1 = conformity check 1
...
pv = conformity check v
x1', .., xn' = guard (x, .., xn, p1, .., pv);
res1, .., resm = _prf_ (x1', .., xn');
res1', .., resm' = guard (res1, .., resm, p1, .., pv);
Because guards now have two variable amounts of arguments: the guarded values xi and the predicates xj, we are required to keep track of the number of returned values. To do this we added an attribute NumVariableRets to the N_prf node in the AST.
Closes #2367 (closed) Closes #2363 (closed)
Future work will include some human-readable context in the guard:
x1', .., xn' = guard (x, .., xn, p1, .., pv, "eg context of _sel_VxA_");
And the types of the returned arguments:
x1', .., xn' = guard (x, .., xn, typ1, .., typen, p1, .., pv);