From: Rémy Oudompheng Date: Tue, 16 Jul 2013 07:04:20 +0000 (+0200) Subject: cmd/gc: fix race detector instrumentation of type switches. X-Git-Tag: go1.2rc2~1043 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a15074c4dc909c6e27a98f8464b79863f446e8cc;p=gostls13.git cmd/gc: fix race detector instrumentation of type switches. A type switch on a value with map index expressions, could get a spurious instrumentation from a OTYPESW node. These nodes do not need instrumentation because after walk the type switch has been turned into a sequence of ifs. Fixes #5890. R=golang-dev, dvyukov CC=golang-dev https://golang.org/cl/11308043 --- diff --git a/src/cmd/gc/racewalk.c b/src/cmd/gc/racewalk.c index dbb11d7b89..4a90549909 100644 --- a/src/cmd/gc/racewalk.c +++ b/src/cmd/gc/racewalk.c @@ -323,10 +323,6 @@ racewalknode(Node **np, NodeList **init, int wr, int skip) racewalknode(&n->left, init, 0, 0); goto ret; - case OTYPESW: - racewalknode(&n->right, init, 0, 0); - goto ret; - // should not appear in AST by now case OSEND: case ORECV: @@ -402,6 +398,7 @@ racewalknode(Node **np, NodeList **init, int wr, int skip) case ONONAME: case OLITERAL: case OSLICESTR: // always preceded by bounds checking, avoid double instrumentation. + case OTYPESW: // ignored by code generation, do not instrument. goto ret; } diff --git a/src/pkg/runtime/race/testdata/mop_test.go b/src/pkg/runtime/race/testdata/mop_test.go index b5eecd9fdf..fe62bb07e1 100644 --- a/src/pkg/runtime/race/testdata/mop_test.go +++ b/src/pkg/runtime/race/testdata/mop_test.go @@ -262,6 +262,25 @@ func TestRaceCaseTypeBody(t *testing.T) { <-c } +func TestRaceCaseTypeIssue5890(t *testing.T) { + // spurious extra instrumentation of the initial interface + // value. + var x, y int + m := make(map[int]map[int]interface{}) + m[0] = make(map[int]interface{}) + c := make(chan int, 1) + go func() { + switch i := m[0][1].(type) { + case nil: + case *int: + *i = x + } + c <- 1 + }() + m[0][1] = y + <-c +} + func TestNoRaceRange(t *testing.T) { ch := make(chan int, 3) a := [...]int{1, 2, 3}