From fc3bec386e85b18152b9893ab6379a33a1706380 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Mon, 20 May 2013 23:45:22 +0200 Subject: [PATCH] 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 --- src/cmd/gc/range.c | 3 +++ src/pkg/runtime/race/testdata/mop_test.go | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/cmd/gc/range.c b/src/cmd/gc/range.c index 8af45b9d274..bd271da386b 100644 --- a/src/cmd/gc/range.c +++ b/src/cmd/gc/range.c @@ -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) { diff --git a/src/pkg/runtime/race/testdata/mop_test.go b/src/pkg/runtime/race/testdata/mop_test.go index fa7abe0ef83..6d30989193e 100644 --- a/src/pkg/runtime/race/testdata/mop_test.go +++ b/src/pkg/runtime/race/testdata/mop_test.go @@ -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