| // 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 | |
| } | |