1
0
mirror of https://github.com/golang/go synced 2024-11-22 22:20:03 -07:00

cmd/gc: clear n->list of OFOR range loop after walk.

It contains the LHS of the range clause and gets
instrumented by racewalk, but it doesn't have any meaning.

Fixes #5446.

R=golang-dev, dvyukov, daniel.morsing, r
CC=golang-dev
https://golang.org/cl/9560044
This commit is contained in:
Rémy Oudompheng 2013-05-20 23:45:22 +02:00
parent 4b0eb19a05
commit fc3bec386e
2 changed files with 16 additions and 0 deletions

View File

@ -129,6 +129,9 @@ walkrange(Node *n)
v2 = N;
if(n->list->next)
v2 = n->list->next->n;
// n->list has no meaning anymore, clear it
// to avoid erroneous processing by racewalk.
n->list = nil;
hv2 = N;
if(v2 == N && t->etype == TARRAY) {

View File

@ -267,6 +267,19 @@ func TestNoRaceRange(t *testing.T) {
close(ch)
}
func TestNoRaceRangeIssue5446(t *testing.T) {
ch := make(chan int, 3)
a := []int{1, 2, 3}
b := []int{4}
// used to insert a spurious instrumentation of a[i]
// and crash.
i := 1
for i, a[i] = range b {
ch <- i
}
close(ch)
}
func TestRaceRange(t *testing.T) {
const N = 2
var a [N]int