]> Cypherpunks repositories - gostls13.git/commitdiff
better error; clean up lineno in a few places
authorRuss Cox <rsc@golang.org>
Thu, 25 Jun 2009 23:32:33 +0000 (16:32 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 25 Jun 2009 23:32:33 +0000 (16:32 -0700)
wreck.mtv=; cat x.go
package main
var x = string.Split()
wreck.mtv=; 6g x.go
x.go:2: type string used as expression
x.go:2: undefined DOT Split on string
x.go:3: illegal types for operand: AS
undefined
wreck.mtv=;

BUG=1938751
R=ken
OCL=30766
CL=30766

src/cmd/gc/const.c
src/cmd/gc/subr.c
src/cmd/gc/walk.c

index 98245fbc4e785396f5db7cf6175a55e95decd3c2..5ce4ebee7404b4d057c70bf5ea3796324a891876 100644 (file)
@@ -84,7 +84,7 @@ convlit1(Node *n, Type *t, int explicit)
                return;
        }
        // avoided repeated calculations, errors
-       if(cvttype(n->type, t)) {
+       if(cvttype(n->type, t) == 1) {
                n->type = t;
                return;
        }
@@ -603,8 +603,7 @@ ret:
        n->val = v;
 
        // check range.
-       lno = lineno;
-       lineno = n->lineno;
+       lno = setlineno(n);
        overflow(v, n->type);
        lineno = lno;
 
index b2b8e77d6e34119b7e7d95e59b32e494942514bd..4f646fbc1e17ac43b190dcb0fa4859a3c1e8ea8e 100644 (file)
@@ -106,7 +106,14 @@ setlineno(Node *n)
        int32 lno;
 
        lno = lineno;
-       if(n != N && n->op != ONAME) {
+       if(n != N)
+       switch(n->op) {
+       case ONAME:
+       case OTYPE:
+       case OPACK:
+       case OLITERAL:
+               break;
+       default:
                lineno = n->lineno;
                if(lineno == 0) {
                        if(debug['K'])
index 18fc7f33594ac72308f14f07afafbfd9d2d80291..50e333797f949100d901055b74f745175adb98e8 100644 (file)
@@ -123,15 +123,7 @@ loop:
                return;
 
        more = N;
-       switch(n->op) {
-       case ONAME:     // one only; lineno isn't right for right now
-       case OPACK:
-       case OTYPE:
-       case OLITERAL:
-               break;
-       default:
-               lineno = n->lineno;
-       }
+       setlineno(n);
 
        switch(n->op) {
 
@@ -253,6 +245,13 @@ loop:
                fatal("walktype: switch 1 unknown op %N", n);
                goto ret;
 
+       case OTYPE:
+               if(!n->diag) {
+                       n->diag = 1;
+                       yyerror("type %T used as expression", n->type);
+               }
+               goto ret;
+
        case ODCL:
                goto ret;
 
@@ -1799,8 +1798,12 @@ walkdot(Node *n)
                n->op = ODOTPTR;
        }
 
-       if(!lookdot(n, t))
-               yyerror("undefined DOT %S on %T", n->right->sym, n->left->type);
+       if(!lookdot(n, t)) {
+               if(!n->diag) {
+                       n->diag = 1;
+                       yyerror("undefined DOT %S on %T", n->right->sym, n->left->type);
+               }
+       }
 }
 
 Node*