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