From 381b72a7a3cc4c7182319f84297d40bb7b459dc4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9my=20Oudompheng?= Date: Thu, 19 Sep 2013 09:23:04 +0200 Subject: [PATCH] cmd/gc: cleanup SWITCH nodes after walk. Keeping pointers from the pre-walk phase confuses the race detection instrumentation. Fixes #6418. R=golang-dev, dvyukov, r CC=golang-dev https://golang.org/cl/13368057 --- src/cmd/gc/swt.c | 3 +++ src/pkg/runtime/race/testdata/mop_test.go | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/cmd/gc/swt.c b/src/cmd/gc/swt.c index c5cb49170d..ced07790ac 100644 --- a/src/cmd/gc/swt.c +++ b/src/cmd/gc/swt.c @@ -820,6 +820,9 @@ walkswitch(Node *sw) return; } exprswitch(sw); + // Discard old AST elements after a walk. They can confuse racewealk. + sw->ntest = nil; + sw->list = nil; } /* diff --git a/src/pkg/runtime/race/testdata/mop_test.go b/src/pkg/runtime/race/testdata/mop_test.go index fe62bb07e1..b0b66562cc 100644 --- a/src/pkg/runtime/race/testdata/mop_test.go +++ b/src/pkg/runtime/race/testdata/mop_test.go @@ -231,6 +231,22 @@ func TestRaceCaseFallthrough(t *testing.T) { <-ch } +func TestRaceCaseIssue6418(t *testing.T) { + m := map[string]map[string]string{ + "a": map[string]string{ + "b": "c", + }, + } + ch := make(chan int) + go func() { + m["a"]["x"] = "y" + ch <- 1 + }() + switch m["a"]["b"] { + } + <-ch +} + func TestRaceCaseType(t *testing.T) { var x, y int var i interface{} = x -- 2.50.0