]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: add .y to error about missing x in x.y
authorRuss Cox <rsc@golang.org>
Thu, 5 Feb 2015 17:31:13 +0000 (12:31 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 13 Feb 2015 17:30:37 +0000 (17:30 +0000)
If the Go source says x.y, and x is undefined, today we get

undefined: x

Change to:

undefined: x in x.y

Change-Id: I8ea95503bd469ea933c6bcbd675b7122a5d454f3
Reviewed-on: https://go-review.googlesource.com/4643
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/gc/go.h
src/cmd/gc/subr.c
src/cmd/gc/typecheck.c

index 38edaea747ab80fe783229ba924935fef765c8ae..0efd40d2bfaef006d993aae15e99ee1265b88f45 100644 (file)
@@ -1448,6 +1448,7 @@ void      warn(char *fmt, ...);
 void   warnl(int line, char *fmt, ...);
 void   yyerror(char *fmt, ...);
 void   yyerrorl(int line, char *fmt, ...);
+void   adderrorname(Node*);
 
 /*
  *     swt.c
index 486e1d8dc92d74549fd131a1fc6a2fbcf688bc43..c91b14d15109e429fad160fd06683ceed5b1be7d 100644 (file)
@@ -38,6 +38,19 @@ parserline(void)
        return lineno;
 }
 
+void
+adderrorname(Node *n)
+{
+       char *old;
+       
+       if(n->op != ODOT)
+               return;
+       old = smprint("%L: undefined: %N\n", n->lineno, n->left);
+       if(nerr > 0 && err[nerr-1].lineno == n->lineno && strcmp(err[nerr-1].msg, old) == 0)
+               err[nerr-1].msg = smprint("%L: undefined: %N in %N\n", n->lineno, n->left, n);
+       free(old);
+}
+
 static void
 adderr(int line, char *fmt, va_list arg)
 {
index 64b80a88cd10ca1586c7c13be5aaa8a6fddd6dc4..c73c34804f85d49dffc86c7d491ea85733157333 100644 (file)
@@ -786,12 +786,14 @@ reswitch:
        case ODOT:
                typecheck(&n->left, Erv|Etype);
                defaultlit(&n->left, T);
-               if((t = n->left->type) == T)
-                       goto error;
                if(n->right->op != ONAME) {
                        yyerror("rhs of . must be a name");     // impossible
                        goto error;
                }
+               if((t = n->left->type) == T) {
+                       adderrorname(n);
+                       goto error;
+               }
                r = n->right;
 
                if(n->left->op == OTYPE) {
@@ -3303,6 +3305,8 @@ typecheckdef(Node *n)
                        n->diag = 1;
                        if(n->lineno != 0)
                                lineno = n->lineno;
+                       // Note: adderrorname looks for this string and
+                       // adds context about the outer expression
                        yyerror("undefined: %S", n->sym);
                }
                return n;