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:
parent
45cff65502
commit
a15074c4dc
@ -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;
|
||||
}
|
||||
|
||||
|
19
src/pkg/runtime/race/testdata/mop_test.go
vendored
19
src/pkg/runtime/race/testdata/mop_test.go
vendored
@ -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}
|
||||
|
Loading…
Reference in New Issue
Block a user