summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/gc/go.h1
-rw-r--r--src/cmd/gc/lex.c2
-rw-r--r--src/cmd/gc/subr.c6
3 files changed, 8 insertions, 1 deletions
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 54c47d0c5..c5e35a1e4 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -419,6 +419,7 @@ EXTERN Dlist dotlist[10]; // size is max depth of embeddeds
EXTERN Io curio;
EXTERN Io pushedio;
EXTERN int32 lineno;
+EXTERN int32 prevlineno;
EXTERN char* pathname;
EXTERN Hist* hist;
EXTERN Hist* ehist;
diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c
index 99a8d7914..d305fb65a 100644
--- a/src/cmd/gc/lex.c
+++ b/src/cmd/gc/lex.c
@@ -300,6 +300,8 @@ yylex(void)
int escflag;
Sym *s;
+ prevlineno = lineno;
+
l0:
c = getc();
if(isspace(c))
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index e1bdde5f5..851f17404 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -269,6 +269,7 @@ dcl(void)
return d;
}
+extern int yychar;
Node*
nod(int op, Node *nleft, Node *nright)
{
@@ -278,7 +279,10 @@ nod(int op, Node *nleft, Node *nright)
n->op = op;
n->left = nleft;
n->right = nright;
- n->lineno = lineno;
+ if(yychar <= 0) // no lookahead
+ n->lineno = lineno;
+ else
+ n->lineno = prevlineno;
return n;
}