github.com/peggyl/go@v0.0.0-20151008231540-ae315999c2d5/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  func (p InterImpl) Foo(x int) {
  1360  	// prevent inlining
  1361  	z := 42
  1362  	x = 85
  1363  	y := x / z
  1364  	z = y * z
  1365  	x = z * y
  1366  	_, _, _ = x, y, z
  1367  }
  1368  
  1369  type InterImpl2 InterImpl
  1370  
  1371  func (p *InterImpl2) Foo(x int) {
  1372  	if p == nil {
  1373  		InterImpl{}.Foo(x)
  1374  	}
  1375  	InterImpl(*p).Foo(x)
  1376  }
  1377  
  1378  func TestRaceInterCall(t *testing.T) {
  1379  	c := make(chan bool, 1)
  1380  	p := InterImpl{}
  1381  	var x Inter = p
  1382  	go func() {
  1383  		p2 := InterImpl{}
  1384  		x = p2
  1385  		c <- true
  1386  	}()
  1387  	x.Foo(0)
  1388  	<-c
  1389  }
  1390  
  1391  func TestRaceInterCall2(t *testing.T) {
  1392  	c := make(chan bool, 1)
  1393  	p := InterImpl{}
  1394  	var x Inter = p
  1395  	z := 0
  1396  	go func() {
  1397  		z = 42
  1398  		c <- true
  1399  	}()
  1400  	x.Foo(z)
  1401  	<-c
  1402  }
  1403  
  1404  func TestRaceFuncCall(t *testing.T) {
  1405  	c := make(chan bool, 1)
  1406  	f := func(x, y int) {}
  1407  	x, y := 0, 0
  1408  	go func() {
  1409  		y = 42
  1410  		c <- true
  1411  	}()
  1412  	f(x, y)
  1413  	<-c
  1414  }
  1415  
  1416  func TestRaceMethodCall(t *testing.T) {
  1417  	c := make(chan bool, 1)
  1418  	i := InterImpl{}
  1419  	x := 0
  1420  	go func() {
  1421  		x = 42
  1422  		c <- true
  1423  	}()
  1424  	i.Foo(x)
  1425  	<-c
  1426  }
  1427  
  1428  func TestRaceMethodCall2(t *testing.T) {
  1429  	c := make(chan bool, 1)
  1430  	i := &InterImpl{}
  1431  	go func() {
  1432  		i = &InterImpl{}
  1433  		c <- true
  1434  	}()
  1435  	i.Foo(0)
  1436  	<-c
  1437  }
  1438  
  1439  // Method value with concrete value receiver.
  1440  func TestRaceMethodValue(t *testing.T) {
  1441  	c := make(chan bool, 1)
  1442  	i := InterImpl{}
  1443  	go func() {
  1444  		i = InterImpl{}
  1445  		c <- true
  1446  	}()
  1447  	_ = i.Foo
  1448  	<-c
  1449  }
  1450  
  1451  // Method value with interface receiver.
  1452  func TestRaceMethodValue2(t *testing.T) {
  1453  	c := make(chan bool, 1)
  1454  	var i Inter = InterImpl{}
  1455  	go func() {
  1456  		i = InterImpl{}
  1457  		c <- true
  1458  	}()
  1459  	_ = i.Foo
  1460  	<-c
  1461  }
  1462  
  1463  // Method value with implicit dereference.
  1464  func TestRaceMethodValue3(t *testing.T) {
  1465  	c := make(chan bool, 1)
  1466  	i := &InterImpl{}
  1467  	go func() {
  1468  		*i = InterImpl{}
  1469  		c <- true
  1470  	}()
  1471  	_ = i.Foo // dereferences i.
  1472  	<-c
  1473  }
  1474  
  1475  // Method value implicitly taking receiver address.
  1476  func TestNoRaceMethodValue(t *testing.T) {
  1477  	c := make(chan bool, 1)
  1478  	i := InterImpl2{}
  1479  	go func() {
  1480  		i = InterImpl2{}
  1481  		c <- true
  1482  	}()
  1483  	_ = i.Foo // takes the address of i only.
  1484  	<-c
  1485  }
  1486  
  1487  func TestRacePanicArg(t *testing.T) {
  1488  	c := make(chan bool, 1)
  1489  	err := errors.New("err")
  1490  	go func() {
  1491  		err = errors.New("err2")
  1492  		c <- true
  1493  	}()
  1494  	defer func() {
  1495  		recover()
  1496  		<-c
  1497  	}()
  1498  	panic(err)
  1499  }
  1500  
  1501  func TestRaceDeferArg(t *testing.T) {
  1502  	c := make(chan bool, 1)
  1503  	x := 0
  1504  	go func() {
  1505  		x = 42
  1506  		c <- true
  1507  	}()
  1508  	func() {
  1509  		defer func(x int) {
  1510  		}(x)
  1511  	}()
  1512  	<-c
  1513  }
  1514  
  1515  type DeferT int
  1516  
  1517  func (d DeferT) Foo() {
  1518  }
  1519  
  1520  func TestRaceDeferArg2(t *testing.T) {
  1521  	c := make(chan bool, 1)
  1522  	var x DeferT
  1523  	go func() {
  1524  		var y DeferT
  1525  		x = y
  1526  		c <- true
  1527  	}()
  1528  	func() {
  1529  		defer x.Foo()
  1530  	}()
  1531  	<-c
  1532  }
  1533  
  1534  func TestNoRaceAddrExpr(t *testing.T) {
  1535  	c := make(chan bool, 1)
  1536  	x := 0
  1537  	go func() {
  1538  		x = 42
  1539  		c <- true
  1540  	}()
  1541  	_ = &x
  1542  	<-c
  1543  }
  1544  
  1545  type AddrT struct {
  1546  	_ [256]byte
  1547  	x int
  1548  }
  1549  
  1550  type AddrT2 struct {
  1551  	_ [512]byte
  1552  	p *AddrT
  1553  }
  1554  
  1555  func TestRaceAddrExpr(t *testing.T) {
  1556  	c := make(chan bool, 1)
  1557  	a := AddrT2{p: &AddrT{x: 42}}
  1558  	go func() {
  1559  		a.p = &AddrT{x: 43}
  1560  		c <- true
  1561  	}()
  1562  	_ = &a.p.x
  1563  	<-c
  1564  }
  1565  
  1566  func TestRaceTypeAssert(t *testing.T) {
  1567  	c := make(chan bool, 1)
  1568  	x := 0
  1569  	var i interface{} = x
  1570  	go func() {
  1571  		y := 0
  1572  		i = y
  1573  		c <- true
  1574  	}()
  1575  	_ = i.(int)
  1576  	<-c
  1577  }
  1578  
  1579  func TestRaceBlockAs(t *testing.T) {
  1580  	c := make(chan bool, 1)
  1581  	var x, y int
  1582  	go func() {
  1583  		x = 42
  1584  		c <- true
  1585  	}()
  1586  	x, y = y, x
  1587  	<-c
  1588  }
  1589  
  1590  func TestRaceBlockCall1(t *testing.T) {
  1591  	done := make(chan bool)
  1592  	x, y := 0, 0
  1593  	go func() {
  1594  		f := func() (int, int) {
  1595  			return 42, 43
  1596  		}
  1597  		x, y = f()
  1598  		done <- true
  1599  	}()
  1600  	_ = x
  1601  	<-done
  1602  	if x != 42 || y != 43 {
  1603  		panic("corrupted data")
  1604  	}
  1605  }
  1606  func TestRaceBlockCall2(t *testing.T) {
  1607  	done := make(chan bool)
  1608  	x, y := 0, 0
  1609  	go func() {
  1610  		f := func() (int, int) {
  1611  			return 42, 43
  1612  		}
  1613  		x, y = f()
  1614  		done <- true
  1615  	}()
  1616  	_ = y
  1617  	<-done
  1618  	if x != 42 || y != 43 {
  1619  		panic("corrupted data")
  1620  	}
  1621  }
  1622  func TestRaceBlockCall3(t *testing.T) {
  1623  	done := make(chan bool)
  1624  	var x *int
  1625  	y := 0
  1626  	go func() {
  1627  		f := func() (*int, int) {
  1628  			i := 42
  1629  			return &i, 43
  1630  		}
  1631  		x, y = f()
  1632  		done <- true
  1633  	}()
  1634  	_ = x
  1635  	<-done
  1636  	if *x != 42 || y != 43 {
  1637  		panic("corrupted data")
  1638  	}
  1639  }
  1640  func TestRaceBlockCall4(t *testing.T) {
  1641  	done := make(chan bool)
  1642  	x := 0
  1643  	var y *int
  1644  	go func() {
  1645  		f := func() (int, *int) {
  1646  			i := 43
  1647  			return 42, &i
  1648  		}
  1649  		x, y = f()
  1650  		done <- true
  1651  	}()
  1652  	_ = y
  1653  	<-done
  1654  	if x != 42 || *y != 43 {
  1655  		panic("corrupted data")
  1656  	}
  1657  }
  1658  func TestRaceBlockCall5(t *testing.T) {
  1659  	done := make(chan bool)
  1660  	var x *int
  1661  	y := 0
  1662  	go func() {
  1663  		f := func() (*int, int) {
  1664  			i := 42
  1665  			return &i, 43
  1666  		}
  1667  		x, y = f()
  1668  		done <- true
  1669  	}()
  1670  	_ = y
  1671  	<-done
  1672  	if *x != 42 || y != 43 {
  1673  		panic("corrupted data")
  1674  	}
  1675  }
  1676  func TestRaceBlockCall6(t *testing.T) {
  1677  	done := make(chan bool)
  1678  	x := 0
  1679  	var y *int
  1680  	go func() {
  1681  		f := func() (int, *int) {
  1682  			i := 43
  1683  			return 42, &i
  1684  		}
  1685  		x, y = f()
  1686  		done <- true
  1687  	}()
  1688  	_ = x
  1689  	<-done
  1690  	if x != 42 || *y != 43 {
  1691  		panic("corrupted data")
  1692  	}
  1693  }
  1694  func TestRaceSliceSlice(t *testing.T) {
  1695  	c := make(chan bool, 1)
  1696  	x := make([]int, 10)
  1697  	go func() {
  1698  		x = make([]int, 20)
  1699  		c <- true
  1700  	}()
  1701  	_ = x[2:3]
  1702  	<-c
  1703  }
  1704  
  1705  func TestRaceSliceSlice2(t *testing.T) {
  1706  	c := make(chan bool, 1)
  1707  	x := make([]int, 10)
  1708  	i := 2
  1709  	go func() {
  1710  		i = 3
  1711  		c <- true
  1712  	}()
  1713  	_ = x[i:4]
  1714  	<-c
  1715  }
  1716  
  1717  func TestRaceSliceString(t *testing.T) {
  1718  	c := make(chan bool, 1)
  1719  	x := "hello"
  1720  	go func() {
  1721  		x = "world"
  1722  		c <- true
  1723  	}()
  1724  	_ = x[2:3]
  1725  	<-c
  1726  }
  1727  
  1728  func TestRaceSliceStruct(t *testing.T) {
  1729  	type X struct {
  1730  		x, y int
  1731  	}
  1732  	c := make(chan bool, 1)
  1733  	x := make([]X, 10)
  1734  	go func() {
  1735  		y := make([]X, 10)
  1736  		copy(y, x)
  1737  		c <- true
  1738  	}()
  1739  	x[1].y = 42
  1740  	<-c
  1741  }
  1742  
  1743  func TestRaceAppendSliceStruct(t *testing.T) {
  1744  	type X struct {
  1745  		x, y int
  1746  	}
  1747  	c := make(chan bool, 1)
  1748  	x := make([]X, 10)
  1749  	go func() {
  1750  		y := make([]X, 0, 10)
  1751  		y = append(y, x...)
  1752  		c <- true
  1753  	}()
  1754  	x[1].y = 42
  1755  	<-c
  1756  }
  1757  
  1758  func TestRaceStructInd(t *testing.T) {
  1759  	c := make(chan bool, 1)
  1760  	type Item struct {
  1761  		x, y int
  1762  	}
  1763  	i := Item{}
  1764  	go func(p *Item) {
  1765  		*p = Item{}
  1766  		c <- true
  1767  	}(&i)
  1768  	i.y = 42
  1769  	<-c
  1770  }
  1771  
  1772  func TestRaceAsFunc1(t *testing.T) {
  1773  	var s []byte
  1774  	c := make(chan bool, 1)
  1775  	go func() {
  1776  		var err error
  1777  		s, err = func() ([]byte, error) {
  1778  			t := []byte("hello world")
  1779  			return t, nil
  1780  		}()
  1781  		c <- true
  1782  		_ = err
  1783  	}()
  1784  	_ = string(s)
  1785  	<-c
  1786  }
  1787  
  1788  func TestRaceAsFunc2(t *testing.T) {
  1789  	c := make(chan bool, 1)
  1790  	x := 0
  1791  	go func() {
  1792  		func(x int) {
  1793  		}(x)
  1794  		c <- true
  1795  	}()
  1796  	x = 42
  1797  	<-c
  1798  }
  1799  
  1800  func TestRaceAsFunc3(t *testing.T) {
  1801  	c := make(chan bool, 1)
  1802  	var mu sync.Mutex
  1803  	x := 0
  1804  	go func() {
  1805  		func(x int) {
  1806  			mu.Lock()
  1807  		}(x) // Read of x must be outside of the mutex.
  1808  		mu.Unlock()
  1809  		c <- true
  1810  	}()
  1811  	mu.Lock()
  1812  	x = 42
  1813  	mu.Unlock()
  1814  	<-c
  1815  }
  1816  
  1817  func TestNoRaceAsFunc4(t *testing.T) {
  1818  	c := make(chan bool, 1)
  1819  	var mu sync.Mutex
  1820  	x := 0
  1821  	go func() {
  1822  		x = func() int { // Write of x must be under the mutex.
  1823  			mu.Lock()
  1824  			return 42
  1825  		}()
  1826  		mu.Unlock()
  1827  		c <- true
  1828  	}()
  1829  	mu.Lock()
  1830  	x = 42
  1831  	mu.Unlock()
  1832  	<-c
  1833  }
  1834  
  1835  func TestRaceHeapParam(t *testing.T) {
  1836  	done := make(chan bool)
  1837  	x := func() (x int) {
  1838  		go func() {
  1839  			x = 42
  1840  			done <- true
  1841  		}()
  1842  		return
  1843  	}()
  1844  	_ = x
  1845  	<-done
  1846  }
  1847  
  1848  func TestNoRaceEmptyStruct(t *testing.T) {
  1849  	type Empty struct{}
  1850  	type X struct {
  1851  		y int64
  1852  		Empty
  1853  	}
  1854  	type Y struct {
  1855  		x X
  1856  		y int64
  1857  	}
  1858  	c := make(chan X)
  1859  	var y Y
  1860  	go func() {
  1861  		x := y.x
  1862  		c <- x
  1863  	}()
  1864  	y.y = 42
  1865  	<-c
  1866  }
  1867  
  1868  func TestRaceNestedStruct(t *testing.T) {
  1869  	type X struct {
  1870  		x, y int
  1871  	}
  1872  	type Y struct {
  1873  		x X
  1874  	}
  1875  	c := make(chan Y)
  1876  	var y Y
  1877  	go func() {
  1878  		c <- y
  1879  	}()
  1880  	y.x.y = 42
  1881  	<-c
  1882  }
  1883  
  1884  func TestRaceIssue5567(t *testing.T) {
  1885  	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
  1886  	in := make(chan []byte)
  1887  	res := make(chan error)
  1888  	go func() {
  1889  		var err error
  1890  		defer func() {
  1891  			close(in)
  1892  			res <- err
  1893  		}()
  1894  		path := "mop_test.go"
  1895  		f, err := os.Open(path)
  1896  		if err != nil {
  1897  			return
  1898  		}
  1899  		defer f.Close()
  1900  		var n, total int
  1901  		b := make([]byte, 17) // the race is on b buffer
  1902  		for err == nil {
  1903  			n, err = f.Read(b)
  1904  			total += n
  1905  			if n > 0 {
  1906  				in <- b[:n]
  1907  			}
  1908  		}
  1909  		if err == io.EOF {
  1910  			err = nil
  1911  		}
  1912  	}()
  1913  	h := sha1.New()
  1914  	for b := range in {
  1915  		h.Write(b)
  1916  	}
  1917  	_ = h.Sum(nil)
  1918  	err := <-res
  1919  	if err != nil {
  1920  		t.Fatal(err)
  1921  	}
  1922  }
  1923  
  1924  func TestRaceIssue5654(t *testing.T) {
  1925  	text := `Friends, Romans, countrymen, lend me your ears;
  1926  I come to bury Caesar, not to praise him.
  1927  The evil that men do lives after them;
  1928  The good is oft interred with their bones;
  1929  So let it be with Caesar. The noble Brutus
  1930  Hath told you Caesar was ambitious:
  1931  If it were so, it was a grievous fault,
  1932  And grievously hath Caesar answer'd it.
  1933  Here, under leave of Brutus and the rest -
  1934  For Brutus is an honourable man;
  1935  So are they all, all honourable men -
  1936  Come I to speak in Caesar's funeral.
  1937  He was my friend, faithful and just to me:
  1938  But Brutus says he was ambitious;
  1939  And Brutus is an honourable man.`
  1940  
  1941  	data := bytes.NewBufferString(text)
  1942  	in := make(chan []byte)
  1943  
  1944  	go func() {
  1945  		buf := make([]byte, 16)
  1946  		var n int
  1947  		var err error
  1948  		for ; err == nil; n, err = data.Read(buf) {
  1949  			in <- buf[:n]
  1950  		}
  1951  		close(in)
  1952  	}()
  1953  	res := ""
  1954  	for s := range in {
  1955  		res += string(s)
  1956  	}
  1957  	_ = res
  1958  }
  1959  
  1960  type Base int
  1961  
  1962  func (b *Base) Foo() int {
  1963  	return 42
  1964  }
  1965  
  1966  func (b Base) Bar() int {
  1967  	return int(b)
  1968  }
  1969  
  1970  func TestNoRaceMethodThunk(t *testing.T) {
  1971  	type Derived struct {
  1972  		pad int
  1973  		Base
  1974  	}
  1975  	var d Derived
  1976  	done := make(chan bool)
  1977  	go func() {
  1978  		_ = d.Foo()
  1979  		done <- true
  1980  	}()
  1981  	d = Derived{}
  1982  	<-done
  1983  }
  1984  
  1985  func TestRaceMethodThunk(t *testing.T) {
  1986  	type Derived struct {
  1987  		pad int
  1988  		*Base
  1989  	}
  1990  	var d Derived
  1991  	done := make(chan bool)
  1992  	go func() {
  1993  		_ = d.Foo()
  1994  		done <- true
  1995  	}()
  1996  	d = Derived{}
  1997  	<-done
  1998  }
  1999  
  2000  func TestRaceMethodThunk2(t *testing.T) {
  2001  	type Derived struct {
  2002  		pad int
  2003  		Base
  2004  	}
  2005  	var d Derived
  2006  	done := make(chan bool)
  2007  	go func() {
  2008  		_ = d.Bar()
  2009  		done <- true
  2010  	}()
  2011  	d = Derived{}
  2012  	<-done
  2013  }
  2014  
  2015  func TestRaceMethodThunk3(t *testing.T) {
  2016  	type Derived struct {
  2017  		pad int
  2018  		*Base
  2019  	}
  2020  	var d Derived
  2021  	d.Base = new(Base)
  2022  	done := make(chan bool)
  2023  	go func() {
  2024  		_ = d.Bar()
  2025  		done <- true
  2026  	}()
  2027  	d.Base = new(Base)
  2028  	<-done
  2029  }
  2030  
  2031  func TestRaceMethodThunk4(t *testing.T) {
  2032  	type Derived struct {
  2033  		pad int
  2034  		*Base
  2035  	}
  2036  	var d Derived
  2037  	d.Base = new(Base)
  2038  	done := make(chan bool)
  2039  	go func() {
  2040  		_ = d.Bar()
  2041  		done <- true
  2042  	}()
  2043  	*(*int)(d.Base) = 42
  2044  	<-done
  2045  }
  2046  
  2047  func TestNoRaceTinyAlloc(t *testing.T) {
  2048  	const P = 4
  2049  	const N = 1e6
  2050  	var tinySink *byte
  2051  	done := make(chan bool)
  2052  	for p := 0; p < P; p++ {
  2053  		go func() {
  2054  			for i := 0; i < N; i++ {
  2055  				var b byte
  2056  				if b != 0 {
  2057  					tinySink = &b // make it heap allocated
  2058  				}
  2059  				b = 42
  2060  			}
  2061  			done <- true
  2062  		}()
  2063  	}
  2064  	for p := 0; p < P; p++ {
  2065  		<-done
  2066  	}
  2067  }