use separate lex buf for better errors:
package main
func main() { func(){}() + + }
x.go:2: syntax error near _f001
becomes
x.go:2: syntax error near func
R=ken
OCL=27047
CL=27047
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 2d8f092..b3f8a50b 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -533,6 +533,7 @@
EXTERN Biobuf* bout;
EXTERN int nerrors;
EXTERN char namebuf[NSYMB];
+EXTERN char lexbuf[NSYMB];
EXTERN char debug[256];
EXTERN Sym* hash[NHASH];
EXTERN Sym* dclstack;
diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c
index c186058..3477a2c 100644
--- a/src/cmd/gc/lex.c
+++ b/src/cmd/gc/lex.c
@@ -370,12 +370,12 @@
if(c >= Runeself) {
/* all multibyte runes are alpha */
- cp = namebuf;
+ cp = lexbuf;
goto talph;
}
if(isalpha(c)) {
- cp = namebuf;
+ cp = lexbuf;
goto talph;
}
@@ -388,13 +388,13 @@
return -1;
case '_':
- cp = namebuf;
+ cp = lexbuf;
goto talph;
case '.':
c1 = getc();
if(isdigit(c1)) {
- cp = namebuf;
+ cp = lexbuf;
*cp++ = c;
c = c1;
c1 = 0;
@@ -413,7 +413,7 @@
case '"':
/* "..." */
- strcpy(namebuf, "\"<string>\"");
+ strcpy(lexbuf, "\"<string>\"");
cp = mal(sizeof(int32));
clen = sizeof(int32);
@@ -437,7 +437,7 @@
case '`':
/* `...` */
- strcpy(namebuf, "`<string>`");
+ strcpy(lexbuf, "`<string>`");
cp = mal(sizeof(int32));
clen = sizeof(int32);
@@ -719,7 +719,7 @@
talph:
/*
- * cp is set to namebuf and some
+ * cp is set to lexbuf and some
* prefix has been stored
*/
for(;;) {
@@ -748,7 +748,7 @@
*cp = 0;
ungetc(c);
- s = lookup(namebuf);
+ s = lookup(lexbuf);
if(s->lexical == LIGNORE)
goto l0;
@@ -768,7 +768,7 @@
tnum:
c1 = 0;
- cp = namebuf;
+ cp = lexbuf;
if(c != '0') {
for(;;) {
*cp++ = c;
@@ -790,7 +790,7 @@
continue;
if(c >= 'A' && c <= 'F')
continue;
- if(cp == namebuf+2)
+ if(cp == lexbuf+2)
yyerror("malformed hex constant");
goto ncu;
}
@@ -826,7 +826,7 @@
ungetc(c);
yylval.val.u.xval = mal(sizeof(*yylval.val.u.xval));
- mpatofix(yylval.val.u.xval, namebuf);
+ mpatofix(yylval.val.u.xval, lexbuf);
if(yylval.val.u.xval->ovf) {
yyerror("overflow in constant");
mpmovecfix(yylval.val.u.xval, 0);
@@ -880,7 +880,7 @@
ungetc(c);
yylval.val.u.fval = mal(sizeof(*yylval.val.u.fval));
- mpatoflt(yylval.val.u.fval, namebuf);
+ mpatoflt(yylval.val.u.fval, lexbuf);
if(yylval.val.u.fval->val.ovf) {
yyerror("overflow in float constant");
mpmovecflt(yylval.val.u.fval, 0.0);
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index d6414f7..fe5d330 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -23,7 +23,7 @@
vfprint(1, fmt, arg);
va_end(arg);
if(strcmp(fmt, "syntax error") == 0)
- print(" near %s", namebuf);
+ print(" near %s", lexbuf);
print("\n");
if(debug['h'])
*(int*)0 = 0;