github.com/hlts2/go@v0.0.0-20170904000733-812b34efaed8/src/runtime/race/testdata/mop_test.go (about)

     1  // Copyright 2011 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  	"bytes"
     9  	"crypto/sha1"
    10  	"errors"
    11  	"fmt"
    12  	"io"
    13  	"os"
    14  	"runtime"
    15  	"sync"
    16  	"testing"
    17  	"time"
    18  	"unsafe"
    19  )
    20  
    21  type Point struct {
    22  	x, y int
    23  }
    24  
    25  type NamedPoint struct {
    26  	name string
    27  	p    Point
    28  }
    29  
    30  type DummyWriter struct {
    31  	state int
    32  }
    33  type Writer interface {
    34  	Write(p []byte) (n int)
    35  }
    36  
    37  func (d DummyWriter) Write(p []byte) (n int) {
    38  	return 0
    39  }
    40  
    41  var GlobalX, GlobalY int = 0, 0
    42  var GlobalCh chan int = make(chan int, 2)
    43  
    44  func GlobalFunc1() {
    45  	GlobalY = GlobalX
    46  	GlobalCh <- 1
    47  }
    48  
    49  func GlobalFunc2() {
    50  	GlobalX = 1
    51  	GlobalCh <- 1
    52  }
    53  
    54  func TestRaceIntRWGlobalFuncs(t *testing.T) {
    55  	go GlobalFunc1()
    56  	go GlobalFunc2()
    57  	<-GlobalCh
    58  	<-GlobalCh
    59  }
    60  
    61  func TestRaceIntRWClosures(t *testing.T) {
    62  	var x, y int
    63  	ch := make(chan int, 2)
    64  
    65  	go func() {
    66  		y = x
    67  		ch <- 1
    68  	}()
    69  	go func() {
    70  		x = 1
    71  		ch <- 1
    72  	}()
    73  	<-ch
    74  	<-ch
    75  }
    76  
    77  func TestNoRaceIntRWClosures(t *testing.T) {
    78  	var x, y int
    79  	ch := make(chan int, 1)
    80  
    81  	go func() {
    82  		y = x
    83  		ch <- 1
    84  	}()
    85  	<-ch
    86  	go func() {
    87  		x = 1
    88  		ch <- 1
    89  	}()
    90  	<-ch
    91  
    92  }
    93  
    94  func TestRaceInt32RWClosures(t *testing.T) {
    95  	var x, y int32
    96  	ch := make(chan bool, 2)
    97  
    98  	go func() {
    99  		y = x
   100  		ch <- true
   101  	}()
   102  	go func() {
   103  		x = 1
   104  		ch <- true
   105  	}()
   106  	<-ch
   107  	<-ch
   108  }
   109  
   110  func TestNoRaceCase(t *testing.T) {
   111  	var y int
   112  	for x := -1; x <= 1; x++ {
   113  		switch {
   114  		case x < 0:
   115  			y = -1
   116  		case x == 0:
   117  			y = 0
   118  		case x > 0:
   119  			y = 1
   120  		}
   121  	}
   122  	y++
   123  }
   124  
   125  func TestRaceCaseCondition(t *testing.T) {
   126  	var x int = 0
   127  	ch := make(chan int, 2)
   128  
   129  	go func() {
   130  		x = 2
   131  		ch <- 1
   132  	}()
   133  	go func() {
   134  		switch x < 2 {
   135  		case true:
   136  			x = 1
   137  			//case false:
   138  			//	x = 5
   139  		}
   140  		ch <- 1
   141  	}()
   142  	<-ch
   143  	<-ch
   144  }
   145  
   146  func TestRaceCaseCondition2(t *testing.T) {
   147  	// switch body is rearranged by the compiler so the tests
   148  	// passes even if we don't instrument '<'
   149  	var x int = 0
   150  	ch := make(chan int, 2)
   151  
   152  	go func() {
   153  		x = 2
   154  		ch <- 1
   155  	}()
   156  	go func() {
   157  		switch x < 2 {
   158  		case true:
   159  			x = 1
   160  		case false:
   161  			x = 5
   162  		}
   163  		ch <- 1
   164  	}()
   165  	<-ch
   166  	<-ch
   167  }
   168  
   169  func TestRaceCaseBody(t *testing.T) {
   170  	var x, y int
   171  	ch := make(chan int, 2)
   172  
   173  	go func() {
   174  		y = x
   175  		ch <- 1
   176  	}()
   177  	go func() {
   178  		switch {
   179  		default:
   180  			x = 1
   181  		case x == 100:
   182  			x = -x
   183  		}
   184  		ch <- 1
   185  	}()
   186  	<-ch
   187  	<-ch
   188  }
   189  
   190  func TestNoRaceCaseFallthrough(t *testing.T) {
   191  	var x, y, z int
   192  	ch := make(chan int, 2)
   193  	z = 1
   194  
   195  	go func() {
   196  		y = x
   197  		ch <- 1
   198  	}()
   199  	go func() {
   200  		switch {
   201  		case z == 1:
   202  		case z == 2:
   203  			x = 2
   204  		}
   205  		ch <- 1
   206  	}()
   207  	<-ch
   208  	<-ch
   209  }
   210  
   211  func TestRaceCaseFallthrough(t *testing.T) {
   212  	var x, y, z int
   213  	ch := make(chan int, 2)
   214  	z = 1
   215  
   216  	go func() {
   217  		y = x
   218  		ch <- 1
   219  	}()
   220  	go func() {
   221  		switch {
   222  		case z == 1:
   223  			fallthrough
   224  		case z == 2:
   225  			x = 2
   226  		}
   227  		ch <- 1
   228  	}()
   229  
   230  	<-ch
   231  	<-ch
   232  }
   233  
   234  func TestRaceCaseIssue6418(t *testing.T) {
   235  	m := map[string]map[string]string{
   236  		"a": {
   237  			"b": "c",
   238  		},
   239  	}
   240  	ch := make(chan int)
   241  	go func() {
   242  		m["a"]["x"] = "y"
   243  		ch <- 1
   244  	}()
   245  	switch m["a"]["b"] {
   246  	}
   247  	<-ch
   248  }
   249  
   250  func TestRaceCaseType(t *testing.T) {
   251  	var x, y int
   252  	var i interface{} = x
   253  	c := make(chan int, 1)
   254  	go func() {
   255  		switch i.(type) {
   256  		case nil:
   257  		case int:
   258  		}
   259  		c <- 1
   260  	}()
   261  	i = y
   262  	<-c
   263  }
   264  
   265  func TestRaceCaseTypeBody(t *testing.T) {
   266  	var x, y int
   267  	var i interface{} = &x
   268  	c := make(chan int, 1)
   269  	go func() {
   270  		switch i := i.(type) {
   271  		case nil:
   272  		case *int:
   273  			*i = y
   274  		}
   275  		c <- 1
   276  	}()
   277  	x = y
   278  	<-c
   279  }
   280  
   281  func TestRaceCaseTypeIssue5890(t *testing.T) {
   282  	// spurious extra instrumentation of the initial interface
   283  	// value.
   284  	var x, y int
   285  	m := make(map[int]map[int]interface{})
   286  	m[0] = make(map[int]interface{})
   287  	c := make(chan int, 1)
   288  	go func() {
   289  		switch i := m[0][1].(type) {
   290  		case nil:
   291  		case *int:
   292  			*i = x
   293  		}
   294  		c <- 1
   295  	}()
   296  	m[0][1] = y
   297  	<-c
   298  }
   299  
   300  func TestNoRaceRange(t *testing.T) {
   301  	ch := make(chan int, 3)
   302  	a := [...]int{1, 2, 3}
   303  	for _, v := range a {
   304  		ch <- v
   305  	}
   306  	close(ch)
   307  }
   308  
   309  func TestNoRaceRangeIssue5446(t *testing.T) {
   310  	ch := make(chan int, 3)
   311  	a := []int{1, 2, 3}
   312  	b := []int{4}
   313  	// used to insert a spurious instrumentation of a[i]
   314  	// and crash.
   315  	i := 1
   316  	for i, a[i] = range b {
   317  		ch <- i
   318  	}
   319  	close(ch)
   320  }
   321  
   322  func TestRaceRange(t *testing.T) {
   323  	const N = 2
   324  	var a [N]int
   325  	var x, y int
   326  	done := make(chan bool, N)
   327  	for i, v := range a {
   328  		go func(i int) {
   329  			// we don't want a write-vs-write race
   330  			// so there is no array b here
   331  			if i == 0 {
   332  				x = v
   333  			} else {
   334  				y = v
   335  			}
   336  			done <- true
   337  		}(i)
   338  		// Ensure the goroutine runs before we continue the loop.
   339  		runtime.Gosched()
   340  	}
   341  	for i := 0; i < N; i++ {
   342  		<-done
   343  	}
   344  }
   345  
   346  func TestRaceForInit(t *testing.T) {
   347  	c := make(chan int)
   348  	x := 0
   349  	go func() {
   350  		c <- x
   351  	}()
   352  	for x = 42; false; {
   353  	}
   354  	<-c
   355  }
   356  
   357  func TestNoRaceForInit(t *testing.T) {
   358  	done := make(chan bool)
   359  	c := make(chan bool)
   360  	x := 0
   361  	go func() {
   362  		for {
   363  			_, ok := <-c
   364  			if !ok {
   365  				done <- true
   366  				return
   367  			}
   368  			x++
   369  		}
   370  	}()
   371  	i := 0
   372  	for x = 42; i < 10; i++ {
   373  		c <- true
   374  	}
   375  	close(c)
   376  	<-done
   377  }
   378  
   379  func TestRaceForTest(t *testing.T) {
   380  	done := make(chan bool)
   381  	c := make(chan bool)
   382  	stop := false
   383  	go func() {
   384  		for {
   385  			_, ok := <-c
   386  			if !ok {
   387  				done <- true
   388  				return
   389  			}
   390  			stop = true
   391  		}
   392  	}()
   393  	for !stop {
   394  		c <- true
   395  	}
   396  	close(c)
   397  	<-done
   398  }
   399  
   400  func TestRaceForIncr(t *testing.T) {
   401  	done := make(chan bool)
   402  	c := make(chan bool)
   403  	x := 0
   404  	go func() {
   405  		for {
   406  			_, ok := <-c
   407  			if !ok {
   408  				done <- true
   409  				return
   410  			}
   411  			x++
   412  		}
   413  	}()
   414  	for i := 0; i < 10; x++ {
   415  		i++
   416  		c <- true
   417  	}
   418  	close(c)
   419  	<-done
   420  }
   421  
   422  func TestNoRaceForIncr(t *testing.T) {
   423  	done := make(chan bool)
   424  	x := 0
   425  	go func() {
   426  		x++
   427  		done <- true
   428  	}()
   429  	for i := 0; i < 0; x++ {
   430  	}
   431  	<-done
   432  }
   433  
   434  func TestRacePlus(t *testing.T) {
   435  	var x, y, z int
   436  	ch := make(chan int, 2)
   437  
   438  	go func() {
   439  		y = x + z
   440  		ch <- 1
   441  	}()
   442  	go func() {
   443  		y = x + z + z
   444  		ch <- 1
   445  	}()
   446  	<-ch
   447  	<-ch
   448  }
   449  
   450  func TestRacePlus2(t *testing.T) {
   451  	var x, y, z int
   452  	ch := make(chan int, 2)
   453  
   454  	go func() {
   455  		x = 1
   456  		ch <- 1
   457  	}()
   458  	go func() {
   459  		y = +x + z
   460  		ch <- 1
   461  	}()
   462  	<-ch
   463  	<-ch
   464  }
   465  
   466  func TestNoRacePlus(t *testing.T) {
   467  	var x, y, z, f int
   468  	ch := make(chan int, 2)
   469  
   470  	go func() {
   471  		y = x + z
   472  		ch <- 1
   473  	}()
   474  	go func() {
   475  		f = z + x
   476  		ch <- 1
   477  	}()
   478  	<-ch
   479  	<-ch
   480  }
   481  
   482  func TestRaceComplement(t *testing.T) {
   483  	var x, y, z int
   484  	ch := make(chan int, 2)
   485  
   486  	go func() {
   487  		x = ^y
   488  		ch <- 1
   489  	}()
   490  	go func() {
   491  		y = ^z
   492  		ch <- 1
   493  	}()
   494  	<-ch
   495  	<-ch
   496  }
   497  
   498  func TestRaceDiv(t *testing.T) {
   499  	var x, y, z int
   500  	ch := make(chan int, 2)
   501  
   502  	go func() {
   503  		x = y / (z + 1)
   504  		ch <- 1
   505  	}()
   506  	go func() {
   507  		y = z
   508  		ch <- 1
   509  	}()
   510  	<-ch
   511  	<-ch
   512  }
   513  
   514  func TestRaceDivConst(t *testing.T) {
   515  	var x, y, z uint32
   516  	ch := make(chan int, 2)
   517  
   518  	go func() {
   519  		x = y / 3 // involves only a HMUL node
   520  		ch <- 1
   521  	}()
   522  	go func() {
   523  		y = z
   524  		ch <- 1
   525  	}()
   526  	<-ch
   527  	<-ch
   528  }
   529  
   530  func TestRaceMod(t *testing.T) {
   531  	var x, y, z int
   532  	ch := make(chan int, 2)
   533  
   534  	go func() {
   535  		x = y % (z + 1)
   536  		ch <- 1
   537  	}()
   538  	go func() {
   539  		y = z
   540  		ch <- 1
   541  	}()
   542  	<-ch
   543  	<-ch
   544  }
   545  
   546  func TestRaceModConst(t *testing.T) {
   547  	var x, y, z int
   548  	ch := make(chan int, 2)
   549  
   550  	go func() {
   551  		x = y % 3
   552  		ch <- 1
   553  	}()
   554  	go func() {
   555  		y = z
   556  		ch <- 1
   557  	}()
   558  	<-ch
   559  	<-ch
   560  }
   561  
   562  func TestRaceRotate(t *testing.T) {
   563  	var x, y, z uint32
   564  	ch := make(chan int, 2)
   565  
   566  	go func() {
   567  		x = y<<12 | y>>20
   568  		ch <- 1
   569  	}()
   570  	go func() {
   571  		y = z
   572  		ch <- 1
   573  	}()
   574  	<-ch
   575  	<-ch
   576  }
   577  
   578  // May crash if the instrumentation is reckless.
   579  func TestNoRaceEnoughRegisters(t *testing.T) {
   580  	// from erf.go
   581  	const (
   582  		sa1 = 1
   583  		sa2 = 2
   584  		sa3 = 3
   585  		sa4 = 4
   586  		sa5 = 5
   587  		sa6 = 6
   588  		sa7 = 7
   589  		sa8 = 8
   590  	)
   591  	var s, S float64
   592  	s = 3.1415
   593  	S = 1 + s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8)))))))
   594  	s = S
   595  }
   596  
   597  // emptyFunc should not be inlined.
   598  func emptyFunc(x int) {
   599  	if false {
   600  		fmt.Println(x)
   601  	}
   602  }
   603  
   604  func TestRaceFuncArgument(t *testing.T) {
   605  	var x int
   606  	ch := make(chan bool, 1)
   607  	go func() {
   608  		emptyFunc(x)
   609  		ch <- true
   610  	}()
   611  	x = 1
   612  	<-ch
   613  }
   614  
   615  func TestRaceFuncArgument2(t *testing.T) {
   616  	var x int
   617  	ch := make(chan bool, 2)
   618  	go func() {
   619  		x = 42
   620  		ch <- true
   621  	}()
   622  	go func(y int) {
   623  		ch <- true
   624  	}(x)
   625  	<-ch
   626  	<-ch
   627  }
   628  
   629  func TestRaceSprint(t *testing.T) {
   630  	var x int
   631  	ch := make(chan bool, 1)
   632  	go func() {
   633  		fmt.Sprint(x)
   634  		ch <- true
   635  	}()
   636  	x = 1
   637  	<-ch
   638  }
   639  
   640  func TestRaceArrayCopy(t *testing.T) {
   641  	ch := make(chan bool, 1)
   642  	var a [5]int
   643  	go func() {
   644  		a[3] = 1
   645  		ch <- true
   646  	}()
   647  	a = [5]int{1, 2, 3, 4, 5}
   648  	<-ch
   649  }
   650  
   651  // Blows up a naive compiler.
   652  func TestRaceNestedArrayCopy(t *testing.T) {
   653  	ch := make(chan bool, 1)
   654  	type (
   655  		Point32   [2][2][2][2][2]Point
   656  		Point1024 [2][2][2][2][2]Point32
   657  		Point32k  [2][2][2][2][2]Point1024
   658  		Point1M   [2][2][2][2][2]Point32k
   659  	)
   660  	var a, b Point1M
   661  	go func() {
   662  		a[0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1].y = 1
   663  		ch <- true
   664  	}()
   665  	a = b
   666  	<-ch
   667  }
   668  
   669  func TestRaceStructRW(t *testing.T) {
   670  	p := Point{0, 0}
   671  	ch := make(chan bool, 1)
   672  	go func() {
   673  		p = Point{1, 1}
   674  		ch <- true
   675  	}()
   676  	q := p
   677  	<-ch
   678  	p = q
   679  }
   680  
   681  func TestRaceStructFieldRW1(t *testing.T) {
   682  	p := Point{0, 0}
   683  	ch := make(chan bool, 1)
   684  	go func() {
   685  		p.x = 1
   686  		ch <- true
   687  	}()
   688  	_ = p.x
   689  	<-ch
   690  }
   691  
   692  func TestNoRaceStructFieldRW1(t *testing.T) {
   693  	// Same struct, different variables, no
   694  	// pointers. The layout is known (at compile time?) ->
   695  	// no read on p
   696  	// writes on x and y
   697  	p := Point{0, 0}
   698  	ch := make(chan bool, 1)
   699  	go func() {
   700  		p.x = 1
   701  		ch <- true
   702  	}()
   703  	p.y = 1
   704  	<-ch
   705  	_ = p
   706  }
   707  
   708  func TestNoRaceStructFieldRW2(t *testing.T) {
   709  	// Same as NoRaceStructFieldRW1
   710  	// but p is a pointer, so there is a read on p
   711  	p := Point{0, 0}
   712  	ch := make(chan bool, 1)
   713  	go func() {
   714  		p.x = 1
   715  		ch <- true
   716  	}()
   717  	p.y = 1
   718  	<-ch
   719  	_ = p
   720  }
   721  
   722  func TestRaceStructFieldRW2(t *testing.T) {
   723  	p := &Point{0, 0}
   724  	ch := make(chan bool, 1)
   725  	go func() {
   726  		p.x = 1
   727  		ch <- true
   728  	}()
   729  	_ = p.x
   730  	<-ch
   731  }
   732  
   733  func TestRaceStructFieldRW3(t *testing.T) {
   734  	p := NamedPoint{name: "a", p: Point{0, 0}}
   735  	ch := make(chan bool, 1)
   736  	go func() {
   737  		p.p.x = 1
   738  		ch <- true
   739  	}()
   740  	_ = p.p.x
   741  	<-ch
   742  }
   743  
   744  func TestRaceEfaceWW(t *testing.T) {
   745  	var a, b interface{}
   746  	ch := make(chan bool, 1)
   747  	go func() {
   748  		a = 1
   749  		ch <- true
   750  	}()
   751  	a = 2
   752  	<-ch
   753  	_, _ = a, b
   754  }
   755  
   756  func TestRaceIfaceWW(t *testing.T) {
   757  	var a, b Writer
   758  	ch := make(chan bool, 1)
   759  	go func() {
   760  		a = DummyWriter{1}
   761  		ch <- true
   762  	}()
   763  	a = DummyWriter{2}
   764  	<-ch
   765  	b = a
   766  	a = b
   767  }
   768  
   769  func TestRaceIfaceCmp(t *testing.T) {
   770  	var a, b Writer
   771  	a = DummyWriter{1}
   772  	ch := make(chan bool, 1)
   773  	go func() {
   774  		a = DummyWriter{1}
   775  		ch <- true
   776  	}()
   777  	_ = a == b
   778  	<-ch
   779  }
   780  
   781  func TestRaceIfaceCmpNil(t *testing.T) {
   782  	var a Writer
   783  	a = DummyWriter{1}
   784  	ch := make(chan bool, 1)
   785  	go func() {
   786  		a = DummyWriter{1}
   787  		ch <- true
   788  	}()
   789  	_ = a == nil
   790  	<-ch
   791  }
   792  
   793  func TestRaceEfaceConv(t *testing.T) {
   794  	c := make(chan bool)
   795  	v := 0
   796  	go func() {
   797  		go func(x interface{}) {
   798  		}(v)
   799  		c <- true
   800  	}()
   801  	v = 42
   802  	<-c
   803  }
   804  
   805  type OsFile struct{}
   806  
   807  func (*OsFile) Read() {
   808  }
   809  
   810  type IoReader interface {
   811  	Read()
   812  }
   813  
   814  func TestRaceIfaceConv(t *testing.T) {
   815  	c := make(chan bool)
   816  	f := &OsFile{}
   817  	go func() {
   818  		go func(x IoReader) {
   819  		}(f)
   820  		c <- true
   821  	}()
   822  	f = &OsFile{}
   823  	<-c
   824  }
   825  
   826  func TestRaceError(t *testing.T) {
   827  	ch := make(chan bool, 1)
   828  	var err error
   829  	go func() {
   830  		err = nil
   831  		ch <- true
   832  	}()
   833  	_ = err
   834  	<-ch
   835  }
   836  
   837  func TestRaceIntptrRW(t *testing.T) {
   838  	var x, y int
   839  	var p *int = &x
   840  	ch := make(chan bool, 1)
   841  	go func() {
   842  		*p = 5
   843  		ch <- true
   844  	}()
   845  	y = *p
   846  	x = y
   847  	<-ch
   848  }
   849  
   850  func TestRaceStringRW(t *testing.T) {
   851  	ch := make(chan bool, 1)
   852  	s := ""
   853  	go func() {
   854  		s = "abacaba"
   855  		ch <- true
   856  	}()
   857  	_ = s
   858  	<-ch
   859  }
   860  
   861  func TestRaceStringPtrRW(t *testing.T) {
   862  	ch := make(chan bool, 1)
   863  	var x string
   864  	p := &x
   865  	go func() {
   866  		*p = "a"
   867  		ch <- true
   868  	}()
   869  	_ = *p
   870  	<-ch
   871  }
   872  
   873  func TestRaceFloat64WW(t *testing.T) {
   874  	var x, y float64
   875  	ch := make(chan bool, 1)
   876  	go func() {
   877  		x = 1.0
   878  		ch <- true
   879  	}()
   880  	x = 2.0
   881  	<-ch
   882  
   883  	y = x
   884  	x = y
   885  }
   886  
   887  func TestRaceComplex128WW(t *testing.T) {
   888  	var x, y complex128
   889  	ch := make(chan bool, 1)
   890  	go func() {
   891  		x = 2 + 2i
   892  		ch <- true
   893  	}()
   894  	x = 4 + 4i
   895  	<-ch
   896  
   897  	y = x
   898  	x = y
   899  }
   900  
   901  func TestRaceUnsafePtrRW(t *testing.T) {
   902  	var x, y, z int
   903  	x, y, z = 1, 2, 3
   904  	var p unsafe.Pointer = unsafe.Pointer(&x)
   905  	ch := make(chan bool, 1)
   906  	go func() {
   907  		p = (unsafe.Pointer)(&z)
   908  		ch <- true
   909  	}()
   910  	y = *(*int)(p)
   911  	x = y
   912  	<-ch
   913  }
   914  
   915  func TestRaceFuncVariableRW(t *testing.T) {
   916  	var f func(x int) int
   917  	f = func(x int) int {
   918  		return x * x
   919  	}
   920  	ch := make(chan bool, 1)
   921  	go func() {
   922  		f = func(x int) int {
   923  			return x
   924  		}
   925  		ch <- true
   926  	}()
   927  	y := f(1)
   928  	<-ch
   929  	x := y
   930  	y = x
   931  }
   932  
   933  func TestRaceFuncVariableWW(t *testing.T) {
   934  	var f func(x int) int
   935  	ch := make(chan bool, 1)
   936  	go func() {
   937  		f = func(x int) int {
   938  			return x
   939  		}
   940  		ch <- true
   941  	}()
   942  	f = func(x int) int {
   943  		return x * x
   944  	}
   945  	<-ch
   946  }
   947  
   948  // This one should not belong to mop_test
   949  func TestRacePanic(t *testing.T) {
   950  	var x int
   951  	var zero int = 0
   952  	ch := make(chan bool, 2)
   953  	go func() {
   954  		defer func() {
   955  			err := recover()
   956  			if err == nil {
   957  				panic("should be panicking")
   958  			}
   959  			x = 1
   960  			ch <- true
   961  		}()
   962  		var y int = 1 / zero
   963  		zero = y
   964  	}()
   965  	go func() {
   966  		defer func() {
   967  			err := recover()
   968  			if err == nil {
   969  				panic("should be panicking")
   970  			}
   971  			x = 2
   972  			ch <- true
   973  		}()
   974  		var y int = 1 / zero
   975  		zero = y
   976  	}()
   977  
   978  	<-ch
   979  	<-ch
   980  	if zero != 0 {
   981  		panic("zero has changed")
   982  	}
   983  }
   984  
   985  func TestNoRaceBlank(t *testing.T) {
   986  	var a [5]int
   987  	ch := make(chan bool, 1)
   988  	go func() {
   989  		_, _ = a[0], a[1]
   990  		ch <- true
   991  	}()
   992  	_, _ = a[2], a[3]
   993  	<-ch
   994  	a[1] = a[0]
   995  }
   996  
   997  func TestRaceAppendRW(t *testing.T) {
   998  	a := make([]int, 10)
   999  	ch := make(chan bool)
  1000  	go func() {
  1001  		_ = append(a, 1)
  1002  		ch <- true
  1003  	}()
  1004  	a[0] = 1
  1005  	<-ch
  1006  }
  1007  
  1008  func TestRaceAppendLenRW(t *testing.T) {
  1009  	a := make([]int, 0)
  1010  	ch := make(chan bool)
  1011  	go func() {
  1012  		a = append(a, 1)
  1013  		ch <- true
  1014  	}()
  1015  	_ = len(a)
  1016  	<-ch
  1017  }
  1018  
  1019  func TestRaceAppendCapRW(t *testing.T) {
  1020  	a := make([]int, 0)
  1021  	ch := make(chan string)
  1022  	go func() {
  1023  		a = append(a, 1)
  1024  		ch <- ""
  1025  	}()
  1026  	_ = cap(a)
  1027  	<-ch
  1028  }
  1029  
  1030  func TestNoRaceFuncArgsRW(t *testing.T) {
  1031  	ch := make(chan byte, 1)
  1032  	var x byte
  1033  	go func(y byte) {
  1034  		_ = y
  1035  		ch <- 0
  1036  	}(x)
  1037  	x = 1
  1038  	<-ch
  1039  }
  1040  
  1041  func TestRaceFuncArgsRW(t *testing.T) {
  1042  	ch := make(chan byte, 1)
  1043  	var x byte
  1044  	go func(y *byte) {
  1045  		_ = *y
  1046  		ch <- 0
  1047  	}(&x)
  1048  	x = 1
  1049  	<-ch
  1050  }
  1051  
  1052  // from the mailing list, slightly modified
  1053  // unprotected concurrent access to seen[]
  1054  func TestRaceCrawl(t *testing.T) {
  1055  	url := "dummyurl"
  1056  	depth := 3
  1057  	seen := make(map[string]bool)
  1058  	ch := make(chan int, 100)
  1059  	var wg sync.WaitGroup
  1060  	var crawl func(string, int)
  1061  	crawl = func(u string, d int) {
  1062  		nurl := 0
  1063  		defer func() {
  1064  			ch <- nurl
  1065  		}()
  1066  		seen[u] = true
  1067  		if d <= 0 {
  1068  			wg.Done()
  1069  			return
  1070  		}
  1071  		urls := [...]string{"a", "b", "c"}
  1072  		for _, uu := range urls {
  1073  			if _, ok := seen[uu]; !ok {
  1074  				wg.Add(1)
  1075  				go crawl(uu, d-1)
  1076  				nurl++
  1077  			}
  1078  		}
  1079  		wg.Done()
  1080  	}
  1081  	wg.Add(1)
  1082  	go crawl(url, depth)
  1083  	wg.Wait()
  1084  }
  1085  
  1086  func TestRaceIndirection(t *testing.T) {
  1087  	ch := make(chan struct{}, 1)
  1088  	var y int
  1089  	var x *int = &y
  1090  	go func() {
  1091  		*x = 1
  1092  		ch <- struct{}{}
  1093  	}()
  1094  	*x = 2
  1095  	<-ch
  1096  	_ = *x
  1097  }
  1098  
  1099  func TestRaceRune(t *testing.T) {
  1100  	c := make(chan bool)
  1101  	var x rune
  1102  	go func() {
  1103  		x = 1
  1104  		c <- true
  1105  	}()
  1106  	_ = x
  1107  	<-c
  1108  }
  1109  
  1110  func TestRaceEmptyInterface1(t *testing.T) {
  1111  	c := make(chan bool)
  1112  	var x interface{}
  1113  	go func() {
  1114  		x = nil
  1115  		c <- true
  1116  	}()
  1117  	_ = x
  1118  	<-c
  1119  }
  1120  
  1121  func TestRaceEmptyInterface2(t *testing.T) {
  1122  	c := make(chan bool)
  1123  	var x interface{}
  1124  	go func() {
  1125  		x = &Point{}
  1126  		c <- true
  1127  	}()
  1128  	_ = x
  1129  	<-c
  1130  }
  1131  
  1132  func TestRaceTLS(t *testing.T) {
  1133  	comm := make(chan *int)
  1134  	done := make(chan bool, 2)
  1135  	go func() {
  1136  		var x int
  1137  		comm <- &x
  1138  		x = 1
  1139  		x = *(<-comm)
  1140  		done <- true
  1141  	}()
  1142  	go func() {
  1143  		p := <-comm
  1144  		*p = 2
  1145  		comm <- p
  1146  		done <- true
  1147  	}()
  1148  	<-done
  1149  	<-done
  1150  }
  1151  
  1152  func TestNoRaceHeapReallocation(t *testing.T) {
  1153  	// It is possible that a future implementation
  1154  	// of memory allocation will ruin this test.
  1155  	// Increasing n might help in this case, so
  1156  	// this test is a bit more generic than most of the
  1157  	// others.
  1158  	const n = 2
  1159  	done := make(chan bool, n)
  1160  	empty := func(p *int) {}
  1161  	for i := 0; i < n; i++ {
  1162  		ms := i
  1163  		go func() {
  1164  			<-time.After(time.Duration(ms) * time.Millisecond)
  1165  			runtime.GC()
  1166  			var x int
  1167  			empty(&x) // x goes to the heap
  1168  			done <- true
  1169  		}()
  1170  	}
  1171  	for i := 0; i < n; i++ {
  1172  		<-done
  1173  	}
  1174  }
  1175  
  1176  func TestRaceAnd(t *testing.T) {
  1177  	c := make(chan bool)
  1178  	x, y := 0, 0
  1179  	go func() {
  1180  		x = 1
  1181  		c <- true
  1182  	}()
  1183  	if x == 1 && y == 1 {
  1184  	}
  1185  	<-c
  1186  }
  1187  
  1188  func TestRaceAnd2(t *testing.T) {
  1189  	c := make(chan bool)
  1190  	x, y := 0, 0
  1191  	go func() {
  1192  		x = 1
  1193  		c <- true
  1194  	}()
  1195  	if y == 0 && x == 1 {
  1196  	}
  1197  	<-c
  1198  }
  1199  
  1200  func TestNoRaceAnd(t *testing.T) {
  1201  	c := make(chan bool)
  1202  	x, y := 0, 0
  1203  	go func() {
  1204  		x = 1
  1205  		c <- true
  1206  	}()
  1207  	if y == 1 && x == 1 {
  1208  	}
  1209  	<-c
  1210  }
  1211  
  1212  func TestRaceOr(t *testing.T) {
  1213  	c := make(chan bool)
  1214  	x, y := 0, 0
  1215  	go func() {
  1216  		x = 1
  1217  		c <- true
  1218  	}()
  1219  	if x == 1 || y == 1 {
  1220  	}
  1221  	<-c
  1222  }
  1223  
  1224  func TestRaceOr2(t *testing.T) {
  1225  	c := make(chan bool)
  1226  	x, y := 0, 0
  1227  	go func() {
  1228  		x = 1
  1229  		c <- true
  1230  	}()
  1231  	if y == 1 || x == 1 {
  1232  	}
  1233  	<-c
  1234  }
  1235  
  1236  func TestNoRaceOr(t *testing.T) {
  1237  	c := make(chan bool)
  1238  	x, y := 0, 0
  1239  	go func() {
  1240  		x = 1
  1241  		c <- true
  1242  	}()
  1243  	if y == 0 || x == 1 {
  1244  	}
  1245  	<-c
  1246  }
  1247  
  1248  func TestNoRaceShortCalc(t *testing.T) {
  1249  	c := make(chan bool)
  1250  	x, y := 0, 0
  1251  	go func() {
  1252  		y = 1
  1253  		c <- true
  1254  	}()
  1255  	if x == 0 || y == 0 {
  1256  	}
  1257  	<-c
  1258  }
  1259  
  1260  func TestNoRaceShortCalc2(t *testing.T) {
  1261  	c := make(chan bool)
  1262  	x, y := 0, 0
  1263  	go func() {
  1264  		y = 1
  1265  		c <- true
  1266  	}()
  1267  	if x == 1 && y == 0 {
  1268  	}
  1269  	<-c
  1270  }
  1271  
  1272  func TestRaceFuncItself(t *testing.T) {
  1273  	c := make(chan bool)
  1274  	f := func() {}
  1275  	go func() {
  1276  		f()
  1277  		c <- true
  1278  	}()
  1279  	f = func() {}
  1280  	<-c
  1281  }
  1282  
  1283  func TestNoRaceFuncUnlock(t *testing.T) {
  1284  	ch := make(chan bool, 1)
  1285  	var mu sync.Mutex
  1286  	x := 0
  1287  	go func() {
  1288  		mu.Lock()
  1289  		x = 42
  1290  		mu.Unlock()
  1291  		ch <- true
  1292  	}()
  1293  	x = func(mu *sync.Mutex) int {
  1294  		mu.Lock()
  1295  		return 43
  1296  	}(&mu)
  1297  	mu.Unlock()
  1298  	<-ch
  1299  }
  1300  
  1301  func TestRaceStructInit(t *testing.T) {
  1302  	type X struct {
  1303  		x, y int
  1304  	}
  1305  	c := make(chan bool, 1)
  1306  	y := 0
  1307  	go func() {
  1308  		y = 42
  1309  		c <- true
  1310  	}()
  1311  	x := X{x: y}
  1312  	_ = x
  1313  	<-c
  1314  }
  1315  
  1316  func TestRaceArrayInit(t *testing.T) {
  1317  	c := make(chan bool, 1)
  1318  	y := 0
  1319  	go func() {
  1320  		y = 42
  1321  		c <- true
  1322  	}()
  1323  	x := []int{0, y, 42}
  1324  	_ = x
  1325  	<-c
  1326  }
  1327  
  1328  func TestRaceMapInit(t *testing.T) {
  1329  	c := make(chan bool, 1)
  1330  	y := 0
  1331  	go func() {
  1332  		y = 42
  1333  		c <- true
  1334  	}()
  1335  	x := map[int]int{0: 42, y: 42}
  1336  	_ = x
  1337  	<-c
  1338  }
  1339  
  1340  func TestRaceMapInit2(t *testing.T) {
  1341  	c := make(chan bool, 1)
  1342  	y := 0
  1343  	go func() {
  1344  		y = 42
  1345  		c <- true
  1346  	}()
  1347  	x := map[int]int{0: 42, 42: y}
  1348  	_ = x
  1349  	<-c
  1350  }
  1351  
  1352  type Inter interface {
  1353  	Foo(x int)
  1354  }
  1355  type InterImpl struct {
  1356  	x, y int
  1357  }
  1358  
  1359  //go:noinline
  1360  func (p InterImpl) Foo(x int) {
  1361  }
  1362  
  1363  type InterImpl2 InterImpl
  1364  
  1365  func (p *InterImpl2) Foo(x int) {
  1366  	if p == nil {
  1367  		InterImpl{}.Foo(x)
  1368  	}
  1369  	InterImpl(*p).Foo(x)
  1370  }
  1371  
  1372  func TestRaceInterCall(t *testing.T) {
  1373  	c := make(chan bool, 1)
  1374  	p := InterImpl{}
  1375  	var x Inter = p
  1376  	go func() {
  1377  		p2 := InterImpl{}
  1378  		x = p2
  1379  		c <- true
  1380  	}()
  1381  	x.Foo(0)
  1382  	<-c
  1383  }
  1384  
  1385  func TestRaceInterCall2(t *testing.T) {
  1386  	c := make(chan bool, 1)
  1387  	p := InterImpl{}
  1388  	var x Inter = p
  1389  	z := 0
  1390  	go func() {
  1391  		z = 42
  1392  		c <- true
  1393  	}()
  1394  	x.Foo(z)
  1395  	<-c
  1396  }
  1397  
  1398  func TestRaceFuncCall(t *testing.T) {
  1399  	c := make(chan bool, 1)
  1400  	f := func(x, y int) {}
  1401  	x, y := 0, 0
  1402  	go func() {
  1403  		y = 42
  1404  		c <- true
  1405  	}()
  1406  	f(x, y)
  1407  	<-c
  1408  }
  1409  
  1410  func TestRaceMethodCall(t *testing.T) {
  1411  	c := make(chan bool, 1)
  1412  	i := InterImpl{}
  1413  	x := 0
  1414  	go func() {
  1415  		x = 42
  1416  		c <- true
  1417  	}()
  1418  	i.Foo(x)
  1419  	<-c
  1420  }
  1421  
  1422  func TestRaceMethodCall2(t *testing.T) {
  1423  	c := make(chan bool, 1)
  1424  	i := &InterImpl{}
  1425  	go func() {
  1426  		i = &InterImpl{}
  1427  		c <- true
  1428  	}()
  1429  	i.Foo(0)
  1430  	<-c
  1431  }
  1432  
  1433  // Method value with concrete value receiver.
  1434  func TestRaceMethodValue(t *testing.T) {
  1435  	c := make(chan bool, 1)
  1436  	i := InterImpl{}
  1437  	go func() {
  1438  		i = InterImpl{}
  1439  		c <- true
  1440  	}()
  1441  	_ = i.Foo
  1442  	<-c
  1443  }
  1444  
  1445  // Method value with interface receiver.
  1446  func TestRaceMethodValue2(t *testing.T) {
  1447  	c := make(chan bool, 1)
  1448  	var i Inter = InterImpl{}
  1449  	go func() {
  1450  		i = InterImpl{}
  1451  		c <- true
  1452  	}()
  1453  	_ = i.Foo
  1454  	<-c
  1455  }
  1456  
  1457  // Method value with implicit dereference.
  1458  func TestRaceMethodValue3(t *testing.T) {
  1459  	c := make(chan bool, 1)
  1460  	i := &InterImpl{}
  1461  	go func() {
  1462  		*i = InterImpl{}
  1463  		c <- true
  1464  	}()
  1465  	_ = i.Foo // dereferences i.
  1466  	<-c
  1467  }
  1468  
  1469  // Method value implicitly taking receiver address.
  1470  func TestNoRaceMethodValue(t *testing.T) {
  1471  	c := make(chan bool, 1)
  1472  	i := InterImpl2{}
  1473  	go func() {
  1474  		i = InterImpl2{}
  1475  		c <- true
  1476  	}()
  1477  	_ = i.Foo // takes the address of i only.
  1478  	<-c
  1479  }
  1480  
  1481  func TestRacePanicArg(t *testing.T) {
  1482  	c := make(chan bool, 1)
  1483  	err := errors.New("err")
  1484  	go func() {
  1485  		err = errors.New("err2")
  1486  		c <- true
  1487  	}()
  1488  	defer func() {
  1489  		recover()
  1490  		<-c
  1491  	}()
  1492  	panic(err)
  1493  }
  1494  
  1495  func TestRaceDeferArg(t *testing.T) {
  1496  	c := make(chan bool, 1)
  1497  	x := 0
  1498  	go func() {
  1499  		x = 42
  1500  		c <- true
  1501  	}()
  1502  	func() {
  1503  		defer func(x int) {
  1504  		}(x)
  1505  	}()
  1506  	<-c
  1507  }
  1508  
  1509  type DeferT int
  1510  
  1511  func (d DeferT) Foo() {
  1512  }
  1513  
  1514  func TestRaceDeferArg2(t *testing.T) {
  1515  	c := make(chan bool, 1)
  1516  	var x DeferT
  1517  	go func() {
  1518  		var y DeferT
  1519  		x = y
  1520  		c <- true
  1521  	}()
  1522  	func() {
  1523  		defer x.Foo()
  1524  	}()
  1525  	<-c
  1526  }
  1527  
  1528  func TestNoRaceAddrExpr(t *testing.T) {
  1529  	c := make(chan bool, 1)
  1530  	x := 0
  1531  	go func() {
  1532  		x = 42
  1533  		c <- true
  1534  	}()
  1535  	_ = &x
  1536  	<-c
  1537  }
  1538  
  1539  type AddrT struct {
  1540  	_ [256]byte
  1541  	x int
  1542  }
  1543  
  1544  type AddrT2 struct {
  1545  	_ [512]byte
  1546  	p *AddrT
  1547  }
  1548  
  1549  func TestRaceAddrExpr(t *testing.T) {
  1550  	c := make(chan bool, 1)
  1551  	a := AddrT2{p: &AddrT{x: 42}}
  1552  	go func() {
  1553  		a.p = &AddrT{x: 43}
  1554  		c <- true
  1555  	}()
  1556  	_ = &a.p.x
  1557  	<-c
  1558  }
  1559  
  1560  func TestRaceTypeAssert(t *testing.T) {
  1561  	c := make(chan bool, 1)
  1562  	x := 0
  1563  	var i interface{} = x
  1564  	go func() {
  1565  		y := 0
  1566  		i = y
  1567  		c <- true
  1568  	}()
  1569  	_ = i.(int)
  1570  	<-c
  1571  }
  1572  
  1573  func TestRaceBlockAs(t *testing.T) {
  1574  	c := make(chan bool, 1)
  1575  	var x, y int
  1576  	go func() {
  1577  		x = 42
  1578  		c <- true
  1579  	}()
  1580  	x, y = y, x
  1581  	<-c
  1582  }
  1583  
  1584  func TestRaceBlockCall1(t *testing.T) {
  1585  	done := make(chan bool)
  1586  	x, y := 0, 0
  1587  	go func() {
  1588  		f := func() (int, int) {
  1589  			return 42, 43
  1590  		}
  1591  		x, y = f()
  1592  		done <- true
  1593  	}()
  1594  	_ = x
  1595  	<-done
  1596  	if x != 42 || y != 43 {
  1597  		panic("corrupted data")
  1598  	}
  1599  }
  1600  func TestRaceBlockCall2(t *testing.T) {
  1601  	done := make(chan bool)
  1602  	x, y := 0, 0
  1603  	go func() {
  1604  		f := func() (int, int) {
  1605  			return 42, 43
  1606  		}
  1607  		x, y = f()
  1608  		done <- true
  1609  	}()
  1610  	_ = y
  1611  	<-done
  1612  	if x != 42 || y != 43 {
  1613  		panic("corrupted data")
  1614  	}
  1615  }
  1616  func TestRaceBlockCall3(t *testing.T) {
  1617  	done := make(chan bool)
  1618  	var x *int
  1619  	y := 0
  1620  	go func() {
  1621  		f := func() (*int, int) {
  1622  			i := 42
  1623  			return &i, 43
  1624  		}
  1625  		x, y = f()
  1626  		done <- true
  1627  	}()
  1628  	_ = x
  1629  	<-done
  1630  	if *x != 42 || y != 43 {
  1631  		panic("corrupted data")
  1632  	}
  1633  }
  1634  func TestRaceBlockCall4(t *testing.T) {
  1635  	done := make(chan bool)
  1636  	x := 0
  1637  	var y *int
  1638  	go func() {
  1639  		f := func() (int, *int) {
  1640  			i := 43
  1641  			return 42, &i
  1642  		}
  1643  		x, y = f()
  1644  		done <- true
  1645  	}()
  1646  	_ = y
  1647  	<-done
  1648  	if x != 42 || *y != 43 {
  1649  		panic("corrupted data")
  1650  	}
  1651  }
  1652  func TestRaceBlockCall5(t *testing.T) {
  1653  	done := make(chan bool)
  1654  	var x *int
  1655  	y := 0
  1656  	go func() {
  1657  		f := func() (*int, int) {
  1658  			i := 42
  1659  			return &i, 43
  1660  		}
  1661  		x, y = f()
  1662  		done <- true
  1663  	}()
  1664  	_ = y
  1665  	<-done
  1666  	if *x != 42 || y != 43 {
  1667  		panic("corrupted data")
  1668  	}
  1669  }
  1670  func TestRaceBlockCall6(t *testing.T) {
  1671  	done := make(chan bool)
  1672  	x := 0
  1673  	var y *int
  1674  	go func() {
  1675  		f := func() (int, *int) {
  1676  			i := 43
  1677  			return 42, &i
  1678  		}
  1679  		x, y = f()
  1680  		done <- true
  1681  	}()
  1682  	_ = x
  1683  	<-done
  1684  	if x != 42 || *y != 43 {
  1685  		panic("corrupted data")
  1686  	}
  1687  }
  1688  func TestRaceSliceSlice(t *testing.T) {
  1689  	c := make(chan bool, 1)
  1690  	x := make([]int, 10)
  1691  	go func() {
  1692  		x = make([]int, 20)
  1693  		c <- true
  1694  	}()
  1695  	_ = x[2:3]
  1696  	<-c
  1697  }
  1698  
  1699  func TestRaceSliceSlice2(t *testing.T) {
  1700  	c := make(chan bool, 1)
  1701  	x := make([]int, 10)
  1702  	i := 2
  1703  	go func() {
  1704  		i = 3
  1705  		c <- true
  1706  	}()
  1707  	_ = x[i:4]
  1708  	<-c
  1709  }
  1710  
  1711  func TestRaceSliceString(t *testing.T) {
  1712  	c := make(chan bool, 1)
  1713  	x := "hello"
  1714  	go func() {
  1715  		x = "world"
  1716  		c <- true
  1717  	}()
  1718  	_ = x[2:3]
  1719  	<-c
  1720  }
  1721  
  1722  func TestRaceSliceStruct(t *testing.T) {
  1723  	type X struct {
  1724  		x, y int
  1725  	}
  1726  	c := make(chan bool, 1)
  1727  	x := make([]X, 10)
  1728  	go func() {
  1729  		y := make([]X, 10)
  1730  		copy(y, x)
  1731  		c <- true
  1732  	}()
  1733  	x[1].y = 42
  1734  	<-c
  1735  }
  1736  
  1737  func TestRaceAppendSliceStruct(t *testing.T) {
  1738  	type X struct {
  1739  		x, y int
  1740  	}
  1741  	c := make(chan bool, 1)
  1742  	x := make([]X, 10)
  1743  	go func() {
  1744  		y := make([]X, 0, 10)
  1745  		y = append(y, x...)
  1746  		c <- true
  1747  	}()
  1748  	x[1].y = 42
  1749  	<-c
  1750  }
  1751  
  1752  func TestRaceStructInd(t *testing.T) {
  1753  	c := make(chan bool, 1)
  1754  	type Item struct {
  1755  		x, y int
  1756  	}
  1757  	i := Item{}
  1758  	go func(p *Item) {
  1759  		*p = Item{}
  1760  		c <- true
  1761  	}(&i)
  1762  	i.y = 42
  1763  	<-c
  1764  }
  1765  
  1766  func TestRaceAsFunc1(t *testing.T) {
  1767  	var s []byte
  1768  	c := make(chan bool, 1)
  1769  	go func() {
  1770  		var err error
  1771  		s, err = func() ([]byte, error) {
  1772  			t := []byte("hello world")
  1773  			return t, nil
  1774  		}()
  1775  		c <- true
  1776  		_ = err
  1777  	}()
  1778  	_ = string(s)
  1779  	<-c
  1780  }
  1781  
  1782  func TestRaceAsFunc2(t *testing.T) {
  1783  	c := make(chan bool, 1)
  1784  	x := 0
  1785  	go func() {
  1786  		func(x int) {
  1787  		}(x)
  1788  		c <- true
  1789  	}()
  1790  	x = 42
  1791  	<-c
  1792  }
  1793  
  1794  func TestRaceAsFunc3(t *testing.T) {
  1795  	c := make(chan bool, 1)
  1796  	var mu sync.Mutex
  1797  	x := 0
  1798  	go func() {
  1799  		func(x int) {
  1800  			mu.Lock()
  1801  		}(x) // Read of x must be outside of the mutex.
  1802  		mu.Unlock()
  1803  		c <- true
  1804  	}()
  1805  	mu.Lock()
  1806  	x = 42
  1807  	mu.Unlock()
  1808  	<-c
  1809  }
  1810  
  1811  func TestNoRaceAsFunc4(t *testing.T) {
  1812  	c := make(chan bool, 1)
  1813  	var mu sync.Mutex
  1814  	x := 0
  1815  	go func() {
  1816  		x = func() int { // Write of x must be under the mutex.
  1817  			mu.Lock()
  1818  			return 42
  1819  		}()
  1820  		mu.Unlock()
  1821  		c <- true
  1822  	}()
  1823  	mu.Lock()
  1824  	x = 42
  1825  	mu.Unlock()
  1826  	<-c
  1827  }
  1828  
  1829  func TestRaceHeapParam(t *testing.T) {
  1830  	done := make(chan bool)
  1831  	x := func() (x int) {
  1832  		go func() {
  1833  			x = 42
  1834  			done <- true
  1835  		}()
  1836  		return
  1837  	}()
  1838  	_ = x
  1839  	<-done
  1840  }
  1841  
  1842  func TestNoRaceEmptyStruct(t *testing.T) {
  1843  	type Empty struct{}
  1844  	type X struct {
  1845  		y int64
  1846  		Empty
  1847  	}
  1848  	type Y struct {
  1849  		x X
  1850  		y int64
  1851  	}
  1852  	c := make(chan X)
  1853  	var y Y
  1854  	go func() {
  1855  		x := y.x
  1856  		c <- x
  1857  	}()
  1858  	y.y = 42
  1859  	<-c
  1860  }
  1861  
  1862  func TestRaceNestedStruct(t *testing.T) {
  1863  	type X struct {
  1864  		x, y int
  1865  	}
  1866  	type Y struct {
  1867  		x X
  1868  	}
  1869  	c := make(chan Y)
  1870  	var y Y
  1871  	go func() {
  1872  		c <- y
  1873  	}()
  1874  	y.x.y = 42
  1875  	<-c
  1876  }
  1877  
  1878  func TestRaceIssue5567(t *testing.T) {
  1879  	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
  1880  	in := make(chan []byte)
  1881  	res := make(chan error)
  1882  	go func() {
  1883  		var err error
  1884  		defer func() {
  1885  			close(in)
  1886  			res <- err
  1887  		}()
  1888  		path := "mop_test.go"
  1889  		f, err := os.Open(path)
  1890  		if err != nil {
  1891  			return
  1892  		}
  1893  		defer f.Close()
  1894  		var n, total int
  1895  		b := make([]byte, 17) // the race is on b buffer
  1896  		for err == nil {
  1897  			n, err = f.Read(b)
  1898  			total += n
  1899  			if n > 0 {
  1900  				in <- b[:n]
  1901  			}
  1902  		}
  1903  		if err == io.EOF {
  1904  			err = nil
  1905  		}
  1906  	}()
  1907  	h := sha1.New()
  1908  	for b := range in {
  1909  		h.Write(b)
  1910  	}
  1911  	_ = h.Sum(nil)
  1912  	err := <-res
  1913  	if err != nil {
  1914  		t.Fatal(err)
  1915  	}
  1916  }
  1917  
  1918  func TestRaceIssue5654(t *testing.T) {
  1919  	text := `Friends, Romans, countrymen, lend me your ears;
  1920  I come to bury Caesar, not to praise him.
  1921  The evil that men do lives after them;
  1922  The good is oft interred with their bones;
  1923  So let it be with Caesar. The noble Brutus
  1924  Hath told you Caesar was ambitious:
  1925  If it were so, it was a grievous fault,
  1926  And grievously hath Caesar answer'd it.
  1927  Here, under leave of Brutus and the rest -
  1928  For Brutus is an honourable man;
  1929  So are they all, all honourable men -
  1930  Come I to speak in Caesar's funeral.
  1931  He was my friend, faithful and just to me:
  1932  But Brutus says he was ambitious;
  1933  And Brutus is an honourable man.`
  1934  
  1935  	data := bytes.NewBufferString(text)
  1936  	in := make(chan []byte)
  1937  
  1938  	go func() {
  1939  		buf := make([]byte, 16)
  1940  		var n int
  1941  		var err error
  1942  		for ; err == nil; n, err = data.Read(buf) {
  1943  			in <- buf[:n]
  1944  		}
  1945  		close(in)
  1946  	}()
  1947  	res := ""
  1948  	for s := range in {
  1949  		res += string(s)
  1950  	}
  1951  	_ = res
  1952  }
  1953  
  1954  type Base int
  1955  
  1956  func (b *Base) Foo() int {
  1957  	return 42
  1958  }
  1959  
  1960  func (b Base) Bar() int {
  1961  	return int(b)
  1962  }
  1963  
  1964  func TestNoRaceMethodThunk(t *testing.T) {
  1965  	type Derived struct {
  1966  		pad int
  1967  		Base
  1968  	}
  1969  	var d Derived
  1970  	done := make(chan bool)
  1971  	go func() {
  1972  		_ = d.Foo()
  1973  		done <- true
  1974  	}()
  1975  	d = Derived{}
  1976  	<-done
  1977  }
  1978  
  1979  func TestRaceMethodThunk(t *testing.T) {
  1980  	type Derived struct {
  1981  		pad int
  1982  		*Base
  1983  	}
  1984  	var d Derived
  1985  	done := make(chan bool)
  1986  	go func() {
  1987  		_ = d.Foo()
  1988  		done <- true
  1989  	}()
  1990  	d = Derived{}
  1991  	<-done
  1992  }
  1993  
  1994  func TestRaceMethodThunk2(t *testing.T) {
  1995  	type Derived struct {
  1996  		pad int
  1997  		Base
  1998  	}
  1999  	var d Derived
  2000  	done := make(chan bool)
  2001  	go func() {
  2002  		_ = d.Bar()
  2003  		done <- true
  2004  	}()
  2005  	d = Derived{}
  2006  	<-done
  2007  }
  2008  
  2009  func TestRaceMethodThunk3(t *testing.T) {
  2010  	type Derived struct {
  2011  		pad int
  2012  		*Base
  2013  	}
  2014  	var d Derived
  2015  	d.Base = new(Base)
  2016  	done := make(chan bool)
  2017  	go func() {
  2018  		_ = d.Bar()
  2019  		done <- true
  2020  	}()
  2021  	d.Base = new(Base)
  2022  	<-done
  2023  }
  2024  
  2025  func TestRaceMethodThunk4(t *testing.T) {
  2026  	type Derived struct {
  2027  		pad int
  2028  		*Base
  2029  	}
  2030  	var d Derived
  2031  	d.Base = new(Base)
  2032  	done := make(chan bool)
  2033  	go func() {
  2034  		_ = d.Bar()
  2035  		done <- true
  2036  	}()
  2037  	*(*int)(d.Base) = 42
  2038  	<-done
  2039  }
  2040  
  2041  func TestNoRaceTinyAlloc(t *testing.T) {
  2042  	const P = 4
  2043  	const N = 1e6
  2044  	var tinySink *byte
  2045  	done := make(chan bool)
  2046  	for p := 0; p < P; p++ {
  2047  		go func() {
  2048  			for i := 0; i < N; i++ {
  2049  				var b byte
  2050  				if b != 0 {
  2051  					tinySink = &b // make it heap allocated
  2052  				}
  2053  				b = 42
  2054  			}
  2055  			done <- true
  2056  		}()
  2057  	}
  2058  	for p := 0; p < P; p++ {
  2059  		<-done
  2060  	}
  2061  }