1// Copyright 2012 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package race_test 6 7import ( 8 "testing" 9) 10 11type P struct { 12 x, y int 13} 14 15type S struct { 16 s1, s2 P 17} 18 19func TestNoRaceComp(t *testing.T) { 20 c := make(chan bool, 1) 21 var s S 22 go func() { 23 s.s2.x = 1 24 c <- true 25 }() 26 s.s2.y = 2 27 <-c 28} 29 30func TestNoRaceComp2(t *testing.T) { 31 c := make(chan bool, 1) 32 var s S 33 go func() { 34 s.s1.x = 1 35 c <- true 36 }() 37 s.s1.y = 2 38 <-c 39} 40 41func TestRaceComp(t *testing.T) { 42 c := make(chan bool, 1) 43 var s S 44 go func() { 45 s.s2.y = 1 46 c <- true 47 }() 48 s.s2.y = 2 49 <-c 50} 51 52func TestRaceComp2(t *testing.T) { 53 c := make(chan bool, 1) 54 var s S 55 go func() { 56 s.s1.x = 1 57 c <- true 58 }() 59 s = S{} 60 <-c 61} 62 63func TestRaceComp3(t *testing.T) { 64 c := make(chan bool, 1) 65 var s S 66 go func() { 67 s.s2.y = 1 68 c <- true 69 }() 70 s = S{} 71 <-c 72} 73 74func TestRaceCompArray(t *testing.T) { 75 c := make(chan bool, 1) 76 s := make([]S, 10) 77 x := 4 78 go func() { 79 s[x].s2.y = 1 80 c <- true 81 }() 82 x = 5 83 <-c 84} 85 86type P2 P 87type S2 S 88 89func TestRaceConv1(t *testing.T) { 90 c := make(chan bool, 1) 91 var p P2 92 go func() { 93 p.x = 1 94 c <- true 95 }() 96 _ = P(p).x 97 <-c 98} 99 100func TestRaceConv2(t *testing.T) { 101 c := make(chan bool, 1) 102 var p P2 103 go func() { 104 p.x = 1 105 c <- true 106 }() 107 ptr := &p 108 _ = P(*ptr).x 109 <-c 110} 111 112func TestRaceConv3(t *testing.T) { 113 c := make(chan bool, 1) 114 var s S2 115 go func() { 116 s.s1.x = 1 117 c <- true 118 }() 119 _ = P2(S(s).s1).x 120 <-c 121} 122 123type X struct { 124 V [4]P 125} 126 127type X2 X 128 129func TestRaceConv4(t *testing.T) { 130 c := make(chan bool, 1) 131 var x X2 132 go func() { 133 x.V[1].x = 1 134 c <- true 135 }() 136 _ = P2(X(x).V[1]).x 137 <-c 138} 139 140type Ptr struct { 141 s1, s2 *P 142} 143 144func TestNoRaceCompPtr(t *testing.T) { 145 c := make(chan bool, 1) 146 p := Ptr{&P{}, &P{}} 147 go func() { 148 p.s1.x = 1 149 c <- true 150 }() 151 p.s1.y = 2 152 <-c 153} 154 155func TestNoRaceCompPtr2(t *testing.T) { 156 c := make(chan bool, 1) 157 p := Ptr{&P{}, &P{}} 158 go func() { 159 p.s1.x = 1 160 c <- true 161 }() 162 _ = p 163 <-c 164} 165 166func TestRaceCompPtr(t *testing.T) { 167 c := make(chan bool, 1) 168 p := Ptr{&P{}, &P{}} 169 go func() { 170 p.s2.x = 1 171 c <- true 172 }() 173 p.s2.x = 2 174 <-c 175} 176 177func TestRaceCompPtr2(t *testing.T) { 178 c := make(chan bool, 1) 179 p := Ptr{&P{}, &P{}} 180 go func() { 181 p.s2.x = 1 182 c <- true 183 }() 184 p.s2 = &P{} 185 <-c 186} 187