aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-01-26 11:26:55 +0300
committerDmitry Vyukov <dvyukov@google.com>2015-01-28 15:14:04 +0000
commitb581ca5956e4cf60de2e32f91b51524054efb29c (patch)
tree1d3687d6026e6232ea230a6c476cb21d5877fc12 /src
parent8bc30e07338d8a8d4a972261e4ff25fa85cec921 (diff)
downloadgo-b581ca5956e4cf60de2e32f91b51524054efb29c.tar.xz
cmd/gc: allow map index expressions in for range statements
Fixes #9691. Change-Id: I22bfc82e05497e91a7b18a668913aed6c723365d Reviewed-on: https://go-review.googlesource.com/3282 Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/go.h1
-rw-r--r--src/cmd/gc/range.c2
-rw-r--r--src/cmd/gc/typecheck.c3
3 files changed, 4 insertions, 2 deletions
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 4aa93b25b2..f3cbd923a0 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -1454,6 +1454,7 @@ void typechecklist(NodeList *l, int top);
Node* typecheckdef(Node *n);
void copytype(Node *n, Type *t);
void checkreturn(Node*);
+void checkassign(Node*);
void queuemethod(Node *n);
/*
diff --git a/src/cmd/gc/range.c b/src/cmd/gc/range.c
index 14bb1be88c..f5f87b2165 100644
--- a/src/cmd/gc/range.c
+++ b/src/cmd/gc/range.c
@@ -89,12 +89,14 @@ typecheckrange(Node *n)
v1->type = t1;
else if(v1->type != T && assignop(t1, v1->type, &why) == 0)
yyerror("cannot assign type %T to %lN in range%s", t1, v1, why);
+ checkassign(v1);
}
if(v2) {
if(v2->defn == n)
v2->type = t2;
else if(v2->type != T && assignop(t2, v2->type, &why) == 0)
yyerror("cannot assign type %T to %lN in range%s", t2, v2, why);
+ checkassign(v2);
}
out:
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index c71cee9b87..ef330c6baf 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -27,7 +27,6 @@ static void typecheckas2(Node*);
static void typecheckas(Node*);
static void typecheckfunc(Node*);
static void checklvalue(Node*, char*);
-static void checkassign(Node*);
static void checkassignlist(NodeList*);
static void stringtoarraylit(Node**);
static Node* resolve(Node*);
@@ -2811,7 +2810,7 @@ checklvalue(Node *n, char *verb)
yyerror("cannot %s %N", verb, n);
}
-static void
+void
checkassign(Node *n)
{
if(islvalue(n))