1// run
2
3// Copyright 2009 The Go Authors.  All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Test that basic operations on named types are valid
8// and preserve the type.
9
10package main
11
12type Array [10]byte
13type Bool bool
14type Chan chan int
15type Float float32
16type Int int
17type Map map[int]byte
18type Slice []byte
19type String string
20
21// Calling these functions checks at compile time that the argument
22// can be converted implicitly to (used as) the given type.
23func asArray(Array)   {}
24func asBool(Bool)     {}
25func asChan(Chan)     {}
26func asFloat(Float)   {}
27func asInt(Int)       {}
28func asMap(Map)       {}
29func asSlice(Slice)   {}
30func asString(String) {}
31
32func (Map) M() {}
33
34
35// These functions check at run time that the default type
36// (in the absence of any implicit conversion hints)
37// is the given type.
38func isArray(x interface{})  { _ = x.(Array) }
39func isBool(x interface{})   { _ = x.(Bool) }
40func isChan(x interface{})   { _ = x.(Chan) }
41func isFloat(x interface{})  { _ = x.(Float) }
42func isInt(x interface{})    { _ = x.(Int) }
43func isMap(x interface{})    { _ = x.(Map) }
44func isSlice(x interface{})  { _ = x.(Slice) }
45func isString(x interface{}) { _ = x.(String) }
46
47func main() {
48	var (
49		a     Array
50		b     Bool   = true
51		c     Chan   = make(Chan)
52		f     Float  = 1
53		i     Int    = 1
54		m     Map    = make(Map)
55		slice Slice  = make(Slice, 10)
56		str   String = "hello"
57	)
58
59	asArray(a)
60	isArray(a)
61	asArray(*&a)
62	isArray(*&a)
63	asArray(Array{})
64	isArray(Array{})
65
66	asBool(b)
67	isBool(b)
68	asBool(!b)
69	isBool(!b)
70	asBool(true)
71	asBool(*&b)
72	isBool(*&b)
73	asBool(Bool(true))
74	isBool(Bool(true))
75
76	asChan(c)
77	isChan(c)
78	asChan(make(Chan))
79	isChan(make(Chan))
80	asChan(*&c)
81	isChan(*&c)
82	asChan(Chan(nil))
83	isChan(Chan(nil))
84
85	asFloat(f)
86	isFloat(f)
87	asFloat(-f)
88	isFloat(-f)
89	asFloat(+f)
90	isFloat(+f)
91	asFloat(f + 1)
92	isFloat(f + 1)
93	asFloat(1 + f)
94	isFloat(1 + f)
95	asFloat(f + f)
96	isFloat(f + f)
97	f++
98	f += 2
99	asFloat(f - 1)
100	isFloat(f - 1)
101	asFloat(1 - f)
102	isFloat(1 - f)
103	asFloat(f - f)
104	isFloat(f - f)
105	f--
106	f -= 2
107	asFloat(f * 2.5)
108	isFloat(f * 2.5)
109	asFloat(2.5 * f)
110	isFloat(2.5 * f)
111	asFloat(f * f)
112	isFloat(f * f)
113	f *= 4
114	asFloat(f / 2.5)
115	isFloat(f / 2.5)
116	asFloat(2.5 / f)
117	isFloat(2.5 / f)
118	asFloat(f / f)
119	isFloat(f / f)
120	f /= 4
121	asFloat(f)
122	isFloat(f)
123	f = 5
124	asFloat(*&f)
125	isFloat(*&f)
126	asFloat(234)
127	asFloat(Float(234))
128	isFloat(Float(234))
129	asFloat(1.2)
130	asFloat(Float(i))
131	isFloat(Float(i))
132
133	asInt(i)
134	isInt(i)
135	asInt(-i)
136	isInt(-i)
137	asInt(^i)
138	isInt(^i)
139	asInt(+i)
140	isInt(+i)
141	asInt(i + 1)
142	isInt(i + 1)
143	asInt(1 + i)
144	isInt(1 + i)
145	asInt(i + i)
146	isInt(i + i)
147	i++
148	i += 1
149	asInt(i - 1)
150	isInt(i - 1)
151	asInt(1 - i)
152	isInt(1 - i)
153	asInt(i - i)
154	isInt(i - i)
155	i--
156	i -= 1
157	asInt(i * 2)
158	isInt(i * 2)
159	asInt(2 * i)
160	isInt(2 * i)
161	asInt(i * i)
162	isInt(i * i)
163	i *= 2
164	asInt(i / 5)
165	isInt(i / 5)
166	asInt(5 / i)
167	isInt(5 / i)
168	asInt(i / i)
169	isInt(i / i)
170	i /= 2
171	asInt(i % 5)
172	isInt(i % 5)
173	asInt(5 % i)
174	isInt(5 % i)
175	asInt(i % i)
176	isInt(i % i)
177	i %= 2
178	asInt(i & 5)
179	isInt(i & 5)
180	asInt(5 & i)
181	isInt(5 & i)
182	asInt(i & i)
183	isInt(i & i)
184	i &= 2
185	asInt(i &^ 5)
186	isInt(i &^ 5)
187	asInt(5 &^ i)
188	isInt(5 &^ i)
189	asInt(i &^ i)
190	isInt(i &^ i)
191	i &^= 2
192	asInt(i | 5)
193	isInt(i | 5)
194	asInt(5 | i)
195	isInt(5 | i)
196	asInt(i | i)
197	isInt(i | i)
198	i |= 2
199	asInt(i ^ 5)
200	isInt(i ^ 5)
201	asInt(5 ^ i)
202	isInt(5 ^ i)
203	asInt(i ^ i)
204	isInt(i ^ i)
205	i ^= 2
206	asInt(i << 4)
207	isInt(i << 4)
208	i <<= 2
209	asInt(i >> 4)
210	isInt(i >> 4)
211	i >>= 2
212	asInt(i)
213	isInt(i)
214	asInt(0)
215	asInt(Int(0))
216	isInt(Int(0))
217	i = 10
218	asInt(*&i)
219	isInt(*&i)
220	asInt(23)
221	asInt(Int(f))
222	isInt(Int(f))
223
224	asMap(m)
225	isMap(m)
226	asMap(nil)
227	m = nil
228	asMap(make(Map))
229	isMap(make(Map))
230	asMap(*&m)
231	isMap(*&m)
232	asMap(Map(nil))
233	isMap(Map(nil))
234	asMap(Map{})
235	isMap(Map{})
236
237	asSlice(slice)
238	isSlice(slice)
239	asSlice(make(Slice, 5))
240	isSlice(make(Slice, 5))
241	asSlice([]byte{1, 2, 3})
242	asSlice([]byte{1, 2, 3}[0:2])
243	asSlice(slice[0:4])
244	isSlice(slice[0:4])
245	asSlice(slice[3:8])
246	isSlice(slice[3:8])
247	asSlice(nil)
248	asSlice(Slice(nil))
249	isSlice(Slice(nil))
250	slice = nil
251	asSlice(Slice{1, 2, 3})
252	isSlice(Slice{1, 2, 3})
253	asSlice(Slice{})
254	isSlice(Slice{})
255	asSlice(*&slice)
256	isSlice(*&slice)
257
258	asString(str)
259	isString(str)
260	asString(str + "a")
261	isString(str + "a")
262	asString("a" + str)
263	isString("a" + str)
264	asString(str + str)
265	isString(str + str)
266	str += "a"
267	str += str
268	asString(String('a'))
269	isString(String('a'))
270	asString(String([]byte(slice)))
271	isString(String([]byte(slice)))
272	asString(String([]byte(nil)))
273	isString(String([]byte(nil)))
274	asString("hello")
275	asString(String("hello"))
276	isString(String("hello"))
277	str = "hello"
278	isString(str)
279	asString(*&str)
280	isString(*&str)
281}
282