]> ocean-lang.org Git - ocean/commitdiff
oceani: improve content in some error messages.
authorNeilBrown <neil@brown.name>
Mon, 6 Dec 2021 06:29:32 +0000 (17:29 +1100)
committerNeilBrown <neil@brown.name>
Wed, 8 Dec 2021 04:56:46 +0000 (15:56 +1100)
In particular:
  use new_pos() instead of new() where appropriate
  set where_set where necessary
  set type name properly in anon types

Signed-off-by: NeilBrown <neil@brown.name>
csrc/oceani-tests.mdc
csrc/oceani.mdc

index f9dce403d3e83f9920736e06853676778bfd7198..d721476903ceb30783a19c9a9389402bc83105f5 100644 (file)
@@ -1027,8 +1027,8 @@ various places that `type_err()` are called.
                print foo
 
 ###### output: bad_main
-       .tmp.code:??:??: error: expected []string but variable 'foo' is string
-       .tmp.code:??:??: info: this is where 'NOTVAR' was set to string
+       .tmp.code:2:10: error: expected []string but variable 'foo' is string
+       .tmp.code:2:10: info: this is where 'foo' was set to string
        oceani: main has wrong type.
 
 Test for type errors with functions
@@ -1077,7 +1077,7 @@ Test for type errors with functions
 
 ###### output: func_err_args
        .tmp.code:34:5: error: function cannot return value of type foo
-       .tmp.code:28:14: error: expected string, found none
+       .tmp.code:28:8: error: expected string, found none
        .tmp.code:25:8: error: expected string, found number
        .tmp.code:15:14: error: insufficient arguments to function.
        .tmp.code:16:14: error: expected number found string
@@ -1088,8 +1088,8 @@ Test for type errors with functions
        .tmp.code:20:14: error: attempt to call a non-function.
        .tmp.code:20:32: error: expected string found number
        .tmp.code:20:28: error: insufficient arguments to function.
-       .tmp.code:21:20: error: expected *invalid*type* but variable 'test2' is *invalid*type*
-       .tmp.code:??:??: info: this is where 'NOTVAR' was set to *invalid*type*
+       .tmp.code:21:20: error: expected "func test1" but variable 'test2' is "func test2"
+       .tmp.code:5:5: info: this is where 'test2' was set to "func test2"
        .tmp.code:10:14: error: variable used but not declared: a
        .tmp.code:10:17: error: variable used but not declared: z
        oceani: type error in program - not running.
index f2cc254612da9316433537ee9e4dba91f128deb4..5dee6d24c06ed4d99130e7569b16c7ee508a94b6 100644 (file)
@@ -478,12 +478,12 @@ from the `exec_types` enum.
                if (loc->type == Xbinode)
                        return __fput_loc(cast(binode,loc)->left, f) ||
                               __fput_loc(cast(binode,loc)->right, f);  // NOTEST
-               return 0;
+               return 0;       // NOTEST
        }
        static void fput_loc(struct exec *loc, FILE *f)
        {
                if (!__fput_loc(loc, f))
-                       fprintf(f, "??:??: ");
+                       fprintf(f, "??:??: ");  // NOTEST
        }
 
 Each different type of `exec` node needs a number of functions defined,
@@ -867,7 +867,7 @@ which might be reported in error messages.
                va_start(ap, name);
                vasprintf(&t.txt, name, ap);
                va_end(ap);
-               t.len = strlen(name);
+               t.len = strlen(t.txt);
                return _add_type(c, t, proto, 1);
        }
 
@@ -894,8 +894,10 @@ which might be reported in error messages.
                        fprintf(f, "%.*s", type->name.len, type->name.txt);
                else if (type->print_type)
                        type->print_type(type, f);
+               else if (type->name.len && type->anon)
+                       fprintf(f, "\"%.*s\"", type->name.len, type->name.txt);
                else
-                       fputs("*invalid*type*", f);
+                       fputs("*invalid*type*", f);     // NOTEST
        }
 
        static void val_init(struct type *type, struct value *val)
@@ -2149,7 +2151,7 @@ correctly.
                        } else
                                fputs("???", stderr);   // NOTEST
                } else
-                       fputs("NOTVAR", stderr);
+                       fputs("NOTVAR", stderr);        // NOTEST
                break;
 
 ###### propagate exec cases
@@ -3096,6 +3098,7 @@ further detailed when Expression Lists are introduced.
                e->var = v;
                if (v) {
                        v->where_decl = e;
+                       v->where_set = e;
                        $0 = v;
                } else {
                        v = var_ref(c, $1.txt);
@@ -3124,7 +3127,7 @@ further detailed when Expression Lists are introduced.
        | Varlist ; ${ $0 = $<1; }$
 
        Varlist -> Varlist ; ArgDecl ${
-               $0 = new(binode);
+               $0 = new_pos(binode, $2);
                $0->op = List;
                $0->left = $<Vl;
                $0->right = $<AD;
@@ -3138,9 +3141,11 @@ further detailed when Expression Lists are introduced.
 
        $*var
        ArgDecl -> IDENTIFIER : FormalType ${ {
-               struct variable *v = var_decl(c, $1.txt);
-               $0 = new(var);
+               struct variable *v = var_decl(c, $ID.txt);
+               $0 = new_pos(var, $ID);
                $0->var = v;
+               v->where_decl = $0;
+               v->where_set = $0;
                v->type = $<FT;
        } }$
 
@@ -4174,19 +4179,19 @@ printed.
 ###### SimpleStatement Grammar
 
        | print ExpressionList ${
-               $0 = b = new(binode);
+               $0 = b = new_pos(binode, $1);
                b->op = Print;
                b->right = NULL;
                b->left = reorder_bilist($<EL);
        }$
        | print ExpressionList , ${ {
-               $0 = b = new(binode);
+               $0 = b = new_pos(binode, $1);
                b->op = Print;
                b->right = reorder_bilist($<EL);
                b->left = NULL;
        } }$
        | print ${
-               $0 = b = new(binode);
+               $0 = b = new_pos(binode, $1);
                b->op = Print;
                b->left = NULL;
                b->right = NULL;