|  | // Copyright 2012 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 ( | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | type P struct { | 
|  | x, y int | 
|  | } | 
|  |  | 
|  | type S struct { | 
|  | s1, s2 P | 
|  | } | 
|  |  | 
|  | func TestNoRaceComp(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var s S | 
|  | go func() { | 
|  | s.s2.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | s.s2.y = 2 | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestNoRaceComp2(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var s S | 
|  | go func() { | 
|  | s.s1.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | s.s1.y = 2 | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceComp(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var s S | 
|  | go func() { | 
|  | s.s2.y = 1 | 
|  | c <- true | 
|  | }() | 
|  | s.s2.y = 2 | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceComp2(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var s S | 
|  | go func() { | 
|  | s.s1.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | s = S{} | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceComp3(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var s S | 
|  | go func() { | 
|  | s.s2.y = 1 | 
|  | c <- true | 
|  | }() | 
|  | s = S{} | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceCompArray(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | s := make([]S, 10) | 
|  | x := 4 | 
|  | go func() { | 
|  | s[x].s2.y = 1 | 
|  | c <- true | 
|  | }() | 
|  | x = 5 | 
|  | <-c | 
|  | } | 
|  |  | 
|  | type P2 P | 
|  | type S2 S | 
|  |  | 
|  | func TestRaceConv1(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var p P2 | 
|  | go func() { | 
|  | p.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | _ = P(p).x | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceConv2(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var p P2 | 
|  | go func() { | 
|  | p.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | ptr := &p | 
|  | _ = P(*ptr).x | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceConv3(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var s S2 | 
|  | go func() { | 
|  | s.s1.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | _ = P2(S(s).s1).x | 
|  | <-c | 
|  | } | 
|  |  | 
|  | type X struct { | 
|  | V [4]P | 
|  | } | 
|  |  | 
|  | type X2 X | 
|  |  | 
|  | func TestRaceConv4(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | var x X2 | 
|  | go func() { | 
|  | x.V[1].x = 1 | 
|  | c <- true | 
|  | }() | 
|  | _ = P2(X(x).V[1]).x | 
|  | <-c | 
|  | } | 
|  |  | 
|  | type Ptr struct { | 
|  | s1, s2 *P | 
|  | } | 
|  |  | 
|  | func TestNoRaceCompPtr(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | p := Ptr{&P{}, &P{}} | 
|  | go func() { | 
|  | p.s1.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | p.s1.y = 2 | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestNoRaceCompPtr2(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | p := Ptr{&P{}, &P{}} | 
|  | go func() { | 
|  | p.s1.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | _ = p | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceCompPtr(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | p := Ptr{&P{}, &P{}} | 
|  | go func() { | 
|  | p.s2.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | p.s2.x = 2 | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func TestRaceCompPtr2(t *testing.T) { | 
|  | c := make(chan bool, 1) | 
|  | p := Ptr{&P{}, &P{}} | 
|  | go func() { | 
|  | p.s2.x = 1 | 
|  | c <- true | 
|  | }() | 
|  | p.s2 = &P{} | 
|  | <-c | 
|  | } |