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>
This commit is contained in:
Dmitry Vyukov 2015-01-26 11:26:55 +03:00
parent 8bc30e0733
commit b581ca5956
4 changed files with 25 additions and 2 deletions

View file

@ -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);
/*

View file

@ -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:

View file

@ -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))

View file

@ -0,0 +1,21 @@
// run
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
func main() {
s := "foo"
b := []byte(s)
m := make(map[string]int)
// Test that map index can be used in range
// and that slicebytetostringtmp is not used in this context.
for m[string(b)] = range s {
}
b[0] = 'b'
if m["foo"] != 2 {
panic("bad")
}
}