summaryrefslogtreecommitdiff
path: root/test/fixedbugs/bug284.go
blob: 68208085fa8c826e457c68fd81be268cf8ecc1f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
// errorcheck

// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test cases for revised conversion rules.

package main

func main() {
	type NewInt int
	i0 := 0
	var i1 int = 1
	var i2 NewInt = 1
	i0 = i0
	i0 = i1
	i0 = int(i2)
	i1 = i0
	i1 = i1
	i1 = int(i2)
	i2 = NewInt(i0)
	i2 = NewInt(i1)
	i2 = i2

	type A1 [3]int
	type A2 [3]NewInt
	var a0 [3]int
	var a1 A1
	var a2 A2
	a0 = a0
	a0 = a1
	a0 = [3]int(a2) // ERROR "cannot|invalid"
	a1 = a0
	a1 = a1
	a1 = A1(a2) // ERROR "cannot|invalid"
	a2 = A2(a0) // ERROR "cannot|invalid"
	a2 = A2(a1) // ERROR "cannot|invalid"
	a2 = a2

	type S1 struct {
		x int
	}
	type S2 struct {
		x NewInt
	}
	var s0 struct {
		x int
	}
	var s1 S1
	var s2 S2
	s0 = s0
	s0 = s1
	s0 = struct {
		x int
	}(s2) // ERROR "cannot|invalid"
	s1 = s0
	s1 = s1
	s1 = S1(s2) // ERROR "cannot|invalid"
	s2 = S2(s0) // ERROR "cannot|invalid"
	s2 = S2(s1) // ERROR "cannot|invalid"
	s2 = s2

	type P1 *int
	type P2 *NewInt
	var p0 *int
	var p1 P1
	var p2 P2
	p0 = p0
	p0 = p1
	p0 = (*int)(p2) // ERROR "cannot|invalid"
	p1 = p0
	p1 = p1
	p1 = P1(p2) // ERROR "cannot|invalid"
	p2 = P2(p0) // ERROR "cannot|invalid"
	p2 = P2(p1) // ERROR "cannot|invalid"
	p2 = p2

	type Q1 *struct {
		x int
	}
	type Q2 *S1
	var q0 *struct {
		x int
	}
	var q1 Q1
	var q2 Q2
	var ps1 *S1
	q0 = q0
	q0 = q1
	q0 = (*struct {
		x int
	})(ps1) // legal because of special conversion exception for pointers
	q0 = (*struct {
		x int
	})(q2) // ERROR "cannot|invalid"
	q1 = q0
	q1 = q1
	q1 = Q1(q2)    // ERROR "cannot|invalid"
	q2 = (*S1)(q0) // legal because of special conversion exception for pointers
	q2 = Q2(q1)    // ERROR "cannot|invalid"
	q2 = q2

	type F1 func(x NewInt) int
	type F2 func(x int) NewInt
	var f0 func(x NewInt) int
	var f1 F1
	var f2 F2
	f0 = f0
	f0 = f1
	f0 = func(x NewInt) int(f2) // ERROR "cannot|invalid"
	f1 = f0
	f1 = f1
	f1 = F1(f2) // ERROR "cannot|invalid"
	f2 = F2(f0) // ERROR "cannot|invalid"
	f2 = F2(f1) // ERROR "cannot|invalid"
	f2 = f2

	type X1 interface {
		f() int
	}
	type X2 interface {
		f() NewInt
	}
	var x0 interface {
		f() int
	}
	var x1 X1
	var x2 X2
	x0 = x0
	x0 = x1
	x0 = interface {
		f() int
	}(x2) // ERROR "cannot|need type assertion|incompatible"
	x1 = x0
	x1 = x1
	x1 = X1(x2) // ERROR "cannot|need type assertion|incompatible"
	x2 = X2(x0) // ERROR "cannot|need type assertion|incompatible"
	x2 = X2(x1) // ERROR "cannot|need type assertion|incompatible"
	x2 = x2

	type L1 []int
	type L2 []NewInt
	var l0 []int
	var l1 L1
	var l2 L2
	l0 = l0
	l0 = l1
	l0 = []int(l2) // ERROR "cannot|invalid"
	l1 = l0
	l1 = l1
	l1 = L1(l2) // ERROR "cannot|invalid"
	l2 = L2(l0) // ERROR "cannot|invalid"
	l2 = L2(l1) // ERROR "cannot|invalid"
	l2 = l2

	type M1 map[string]int
	type M2 map[string]NewInt
	var m0 []int
	var m1 L1
	var m2 L2
	m0 = m0
	m0 = m1
	m0 = []int(m2) // ERROR "cannot|invalid"
	m1 = m0
	m1 = m1
	m1 = L1(m2) // ERROR "cannot|invalid"
	m2 = L2(m0) // ERROR "cannot|invalid"
	m2 = L2(m1) // ERROR "cannot|invalid"
	m2 = m2

	type C1 chan int
	type C2 chan NewInt
	var c0 chan int
	var c1 C1
	var c2 C2
	c0 = c0
	c0 = c1
	c0 = chan int(c2) // ERROR "cannot|invalid"
	c1 = c0
	c1 = c1
	c1 = C1(c2) // ERROR "cannot|invalid"
	c2 = C2(c0) // ERROR "cannot|invalid"
	c2 = C2(c1) // ERROR "cannot|invalid"
	c2 = c2

	// internal compiler error (6g and gccgo)
	type T interface{}
	var _ T = 17 // assignment compatible
	_ = T(17)    // internal compiler error even though assignment compatible
}