| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package race_test |
| |
| import ( |
| "fmt" |
| "testing" |
| ) |
| |
| var issue12664 = "hi" |
| |
| func TestRaceIssue12664(t *testing.T) { |
| c := make(chan struct{}) |
| go func() { |
| issue12664 = "bye" |
| close(c) |
| }() |
| fmt.Println(issue12664) |
| <-c |
| } |
| |
| type MyI interface { |
| foo() |
| } |
| |
| type MyT int |
| |
| func (MyT) foo() { |
| } |
| |
| var issue12664_2 MyT = 0 |
| |
| func TestRaceIssue12664_2(t *testing.T) { |
| c := make(chan struct{}) |
| go func() { |
| issue12664_2 = 1 |
| close(c) |
| }() |
| func(x MyI) { |
| // Never true, but prevents inlining. |
| if x.(MyT) == -1 { |
| close(c) |
| } |
| }(issue12664_2) |
| <-c |
| } |
| |
| var issue12664_3 MyT = 0 |
| |
| func TestRaceIssue12664_3(t *testing.T) { |
| c := make(chan struct{}) |
| go func() { |
| issue12664_3 = 1 |
| close(c) |
| }() |
| var r MyT |
| var i interface{} = r |
| issue12664_3 = i.(MyT) |
| <-c |
| } |
| |
| var issue12664_4 MyT = 0 |
| |
| func TestRaceIssue12664_4(t *testing.T) { |
| c := make(chan struct{}) |
| go func() { |
| issue12664_4 = 1 |
| close(c) |
| }() |
| var r MyT |
| var i MyI = r |
| issue12664_4 = i.(MyT) |
| <-c |
| } |