Commit a15074c4 authored by Rémy Oudompheng's avatar Rémy Oudompheng

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
parent 45cff655
...@@ -323,10 +323,6 @@ racewalknode(Node **np, NodeList **init, int wr, int skip) ...@@ -323,10 +323,6 @@ racewalknode(Node **np, NodeList **init, int wr, int skip)
racewalknode(&n->left, init, 0, 0); racewalknode(&n->left, init, 0, 0);
goto ret; goto ret;
case OTYPESW:
racewalknode(&n->right, init, 0, 0);
goto ret;
// should not appear in AST by now // should not appear in AST by now
case OSEND: case OSEND:
case ORECV: case ORECV:
...@@ -402,6 +398,7 @@ racewalknode(Node **np, NodeList **init, int wr, int skip) ...@@ -402,6 +398,7 @@ racewalknode(Node **np, NodeList **init, int wr, int skip)
case ONONAME: case ONONAME:
case OLITERAL: case OLITERAL:
case OSLICESTR: // always preceded by bounds checking, avoid double instrumentation. case OSLICESTR: // always preceded by bounds checking, avoid double instrumentation.
case OTYPESW: // ignored by code generation, do not instrument.
goto ret; goto ret;
} }
......
...@@ -262,6 +262,25 @@ func TestRaceCaseTypeBody(t *testing.T) { ...@@ -262,6 +262,25 @@ func TestRaceCaseTypeBody(t *testing.T) {
<-c <-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) { func TestNoRaceRange(t *testing.T) {
ch := make(chan int, 3) ch := make(chan int, 3)
a := [...]int{1, 2, 3} a := [...]int{1, 2, 3}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment