oceani: don't let error in one statement hides errors in next.
authorNeilBrown <neil@brown.name>
Wed, 22 Dec 2021 06:12:20 +0000 (17:12 +1100)
committerNeilBrown <neil@brown.name>
Wed, 22 Dec 2021 06:13:53 +0000 (17:13 +1100)
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>
csrc/oceani-tests.mdc
csrc/oceani.mdc

index 0feb0d20ba0b86f17869b47931e998705a23a0d3..182c77c8367b2e553c6619f410e2eee512a671cb 100644 (file)
@@ -917,7 +917,7 @@ various places that `type_err()` are called.
 
        func main()
                print "hello" ++ 5, 5 ++ "hello"
-
+               hello := "there"; print 4+hello
                b ::= 3
                b = b + 1
 
@@ -928,6 +928,8 @@ various places that `type_err()` are called.
 ###### 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
index d40a5488f4de9d0755896493b15ba6e05bb5804b..f97652d025ca4c90ef8e183ac45bea0eed41a677 100644 (file)
@@ -2096,7 +2096,7 @@ stack.
                        if (v->merged != v)
                                continue;
                        if (!t)
-                               continue;
+                               continue;       // NOTEST
                        if (v->frame_pos >= 0)
                                continue;
                        while (done && done->scope_end < v->scope_start)
@@ -4605,7 +4605,9 @@ the common header for all reductions to use.
                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)