~ubuntu-branches/ubuntu/saucy/golang/saucy

« back to all changes in this revision

Viewing changes to src/pkg/runtime/race/testdata/regression_test.go

  • Committer: Package Import Robot
  • Author(s): Adam Conrad
  • Date: 2013-07-08 05:52:37 UTC
  • mfrom: (29.1.1 sid)
  • Revision ID: package-import@ubuntu.com-20130708055237-at01839e0hp8z3ni
Tags: 2:1.1-1ubuntu1
016-armhf-elf-header.patch: Use correct ELF header for armhf binaries.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2012 The Go Authors. All rights reserved.
 
2
// Use of this source code is governed by a BSD-style
 
3
// license that can be found in the LICENSE file.
 
4
 
 
5
// Code patterns that caused problems in the past.
 
6
 
 
7
package race_test
 
8
 
 
9
import (
 
10
        "testing"
 
11
)
 
12
 
 
13
type LogImpl struct {
 
14
        x int
 
15
}
 
16
 
 
17
func NewLog() (l LogImpl) {
 
18
        c := make(chan bool)
 
19
        go func() {
 
20
                _ = l
 
21
                c <- true
 
22
        }()
 
23
        l = LogImpl{}
 
24
        <-c
 
25
        return
 
26
}
 
27
 
 
28
var _ LogImpl = NewLog()
 
29
 
 
30
func MakeMap() map[int]int {
 
31
        return make(map[int]int)
 
32
}
 
33
 
 
34
func InstrumentMapLen() {
 
35
        _ = len(MakeMap())
 
36
}
 
37
 
 
38
func InstrumentMapLen2() {
 
39
        m := make(map[int]map[int]int)
 
40
        _ = len(m[0])
 
41
}
 
42
 
 
43
func InstrumentMapLen3() {
 
44
        m := make(map[int]*map[int]int)
 
45
        _ = len(*m[0])
 
46
}
 
47
 
 
48
func TestRaceUnaddressableMapLen(t *testing.T) {
 
49
        m := make(map[int]map[int]int)
 
50
        ch := make(chan int, 1)
 
51
        m[0] = make(map[int]int)
 
52
        go func() {
 
53
                _ = len(m[0])
 
54
                ch <- 0
 
55
        }()
 
56
        m[0][0] = 1
 
57
        <-ch
 
58
}
 
59
 
 
60
type Rect struct {
 
61
        x, y int
 
62
}
 
63
 
 
64
type Image struct {
 
65
        min, max Rect
 
66
}
 
67
 
 
68
func NewImage() Image {
 
69
        var pleaseDoNotInlineMe stack
 
70
        pleaseDoNotInlineMe.push(1)
 
71
        _ = pleaseDoNotInlineMe.pop()
 
72
        return Image{}
 
73
}
 
74
 
 
75
func AddrOfTemp() {
 
76
        _ = NewImage().min
 
77
}
 
78
 
 
79
type TypeID int
 
80
 
 
81
func (t *TypeID) encodeType(x int) (tt TypeID, err error) {
 
82
        switch x {
 
83
        case 0:
 
84
                return t.encodeType(x * x)
 
85
        }
 
86
        return 0, nil
 
87
}
 
88
 
 
89
type stack []int
 
90
 
 
91
func (s *stack) push(x int) {
 
92
        *s = append(*s, x)
 
93
}
 
94
 
 
95
func (s *stack) pop() int {
 
96
        i := len(*s)
 
97
        n := (*s)[i-1]
 
98
        *s = (*s)[:i-1]
 
99
        return n
 
100
}
 
101
 
 
102
func TestNoRaceStackPushPop(t *testing.T) {
 
103
        var s stack
 
104
        go func(s *stack) {}(&s)
 
105
        s.push(1)
 
106
        x := s.pop()
 
107
        _ = x
 
108
}
 
109
 
 
110
type RpcChan struct {
 
111
        c chan bool
 
112
}
 
113
 
 
114
var makeChanCalls int
 
115
 
 
116
func makeChan() *RpcChan {
 
117
        var pleaseDoNotInlineMe stack
 
118
        pleaseDoNotInlineMe.push(1)
 
119
        _ = pleaseDoNotInlineMe.pop()
 
120
 
 
121
        makeChanCalls++
 
122
        c := &RpcChan{make(chan bool, 1)}
 
123
        c.c <- true
 
124
        return c
 
125
}
 
126
 
 
127
func call() bool {
 
128
        x := <-makeChan().c
 
129
        return x
 
130
}
 
131
 
 
132
func TestNoRaceRpcChan(t *testing.T) {
 
133
        makeChanCalls = 0
 
134
        _ = call()
 
135
        if makeChanCalls != 1 {
 
136
                t.Fatalf("makeChanCalls %d, expected 1\n", makeChanCalls)
 
137
        }
 
138
}
 
139
 
 
140
func divInSlice() {
 
141
        v := make([]int64, 10)
 
142
        i := 1
 
143
        _ = v[(i*4)/3]
 
144
}
 
145
 
 
146
func TestNoRaceReturn(t *testing.T) {
 
147
        c := make(chan int)
 
148
        noRaceReturn(c)
 
149
        <-c
 
150
}
 
151
 
 
152
// Return used to do an implicit a = a, causing a read/write race
 
153
// with the goroutine. Compiler has an optimization to avoid that now.
 
154
// See issue 4014.
 
155
func noRaceReturn(c chan int) (a, b int) {
 
156
        a = 42
 
157
        go func() {
 
158
                _ = a
 
159
                c <- 1
 
160
        }()
 
161
        return a, 10
 
162
}