Home | History | Annotate | Download | only in testdata
      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 }
   2062