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