From: Rémy Oudompheng Date: Thu, 19 Sep 2013 07:23:04 +0000 (+0200) Subject: cmd/gc: cleanup SWITCH nodes after walk. X-Git-Tag: go1.2rc2~164 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=381b72a7a3cc4c7182319f84297d40bb7b459dc4;p=gostls13.git cmd/gc: cleanup SWITCH nodes after walk. Keeping pointers from the pre-walk phase confuses the race detection instrumentation. Fixes #6418. R=golang-dev, dvyukov, r CC=golang-dev https://golang.org/cl/13368057 --- diff --git a/src/cmd/gc/swt.c b/src/cmd/gc/swt.c index c5cb49170d..ced07790ac 100644 --- a/src/cmd/gc/swt.c +++ b/src/cmd/gc/swt.c @@ -820,6 +820,9 @@ walkswitch(Node *sw) return; } exprswitch(sw); + // Discard old AST elements after a walk. They can confuse racewealk. + sw->ntest = nil; + sw->list = nil; } /* diff --git a/src/pkg/runtime/race/testdata/mop_test.go b/src/pkg/runtime/race/testdata/mop_test.go index fe62bb07e1..b0b66562cc 100644 --- a/src/pkg/runtime/race/testdata/mop_test.go +++ b/src/pkg/runtime/race/testdata/mop_test.go @@ -231,6 +231,22 @@ func TestRaceCaseFallthrough(t *testing.T) { <-ch } +func TestRaceCaseIssue6418(t *testing.T) { + m := map[string]map[string]string{ + "a": map[string]string{ + "b": "c", + }, + } + ch := make(chan int) + go func() { + m["a"]["x"] = "y" + ch <- 1 + }() + switch m["a"]["b"] { + } + <-ch +} + func TestRaceCaseType(t *testing.T) { var x, y int var i interface{} = x