summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/gc/go.y55
-rw-r--r--src/cmd/gc/walk.c2
2 files changed, 56 insertions, 1 deletions
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index dedef05d5..071d51b64 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -1644,3 +1644,58 @@ hidden_importfield:
$$ = $2;
$$->fsym = $1;
}
+
+/*
+ * helpful error messages.
+ * THIS SECTION MUST BE AT THE END OF THE FILE.
+ *
+ * these rules trigger reduce/reduce conflicts in the grammar.
+ * they are safe because reduce/reduce conflicts are resolved
+ * in favor of rules appearing earlier in the grammar, and these
+ * are at the end of the file.
+ *
+ * to check whether the rest of the grammar is free of
+ * reduce/reduce conflicts, comment this section out by
+ * removing the slash on the next line.
+ */
+lpack:
+ LATYPE
+ {
+ yyerror("%s is type, not package", $1->name);
+ YYERROR;
+ }
+
+laconst:
+ LPACK
+ {
+ // for LALR(1) reasons, using laconst works here
+ // but lname does not. even so, the messages make
+ // more sense saying "var" instead of "const".
+ yyerror("%s is package, not var", $1->name);
+ YYERROR;
+ }
+| LATYPE
+ {
+ yyerror("%s is type, not var", $1->name);
+ YYERROR;
+ }
+
+latype:
+ LACONST
+ {
+ yyerror("%s is const, not type", $1->name);
+ YYERROR;
+ }
+| LPACK
+ {
+ yyerror("%s is package, not type", $1->name);
+ YYERROR;
+ }
+| LNAME
+ {
+ yyerror("%s is var, not type", $1->name);
+ YYERROR;
+ }
+
+/**/
+
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 7349915b2..ecdb4dd7f 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1420,7 +1420,7 @@ walkdot(Node *n)
f = lookdot(n->right, t->method);
if(f == T) {
- yyerror("undefined DOT reference %N", n->right);
+ yyerror("undefined DOT %s", n->right->sym->name);
return;
}