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