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