Home | History | Annotate | Download | only in testdata
      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 
      5 package race_test
      6 
      7 import (
      8 	"testing"
      9 )
     10 
     11 type P struct {
     12 	x, y int
     13 }
     14 
     15 type S struct {
     16 	s1, s2 P
     17 }
     18 
     19 func 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 
     30 func 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 
     41 func 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 
     52 func 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 
     63 func 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 
     74 func 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 
     86 type P2 P
     87 type S2 S
     88 
     89 func 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 
    100 func 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 
    112 func 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 
    123 type X struct {
    124 	V [4]P
    125 }
    126 
    127 type X2 X
    128 
    129 func 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 
    140 type Ptr struct {
    141 	s1, s2 *P
    142 }
    143 
    144 func 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 
    155 func 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 
    166 func 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 
    177 func 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