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:
parent
4b0eb19a05
commit
fc3bec386e
@ -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) {
|
||||
|
13
src/pkg/runtime/race/testdata/mop_test.go
vendored
13
src/pkg/runtime/race/testdata/mop_test.go
vendored
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user