1
0
mirror of https://github.com/golang/go synced 2024-11-25 13:07:57 -07:00

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
This commit is contained in:
Rémy Oudompheng 2013-07-16 09:04:20 +02:00
parent 45cff65502
commit a15074c4dc
2 changed files with 20 additions and 4 deletions

View File

@ -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;
}

View File

@ -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}