The error state from one statement is still visible in the next, which
can upset the reporting of errors.
So provide a clean error state for each new statement.
Signed-off-by: NeilBrown <neil@brown.name>
func main()
print "hello" ++ 5, 5 ++ "hello"
-
+ hello := "there"; print 4+hello
b ::= 3
b = b + 1
###### output: type_err1
.tmp.code:3:25: error: expected string found number
.tmp.code:3:28: error: expected string found number
+ .tmp.code:4:34: error: expected number but variable 'hello' is string
+ .tmp.code:4:8: info: this is where 'hello' was set to string
.tmp.code:6:8: error: Cannot assign to a constant: b
.tmp.code:5:8: info: name was defined as a constant here
.tmp.code:8:11: error: Arithmetic returns number but Boolean expected
if (v->merged != v)
continue;
if (!t)
- continue;
+ continue; // NOTEST
if (v->frame_pos >= 0)
continue;
while (done && done->scope_end < v->scope_start)
struct binode *e;
for (e = b; e; e = cast(binode, e->right)) {
- t = propagate_types(e->left, c, perr, NULL, rules);
+ *perr |= *perr_local;
+ *perr_local = 0;
+ t = propagate_types(e->left, c, perr_local, NULL, rules);
if ((rules & Rboolok) && (t == Tbool || t == Tnone))
t = NULL;
if (t == Tnone && e->right)