// $G $D/$F.go && $L $F.$A && ./$A.out // Copyright 2009 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 that basic operations on named types are valid // and preserve the type. package main type Array [10]byte type Bool bool type Chan chan int type Float float type Int int type Map map[int]byte type Slice []byte type String string // Calling these functions checks at compile time that the argument // can be converted implicitly to (used as) the given type. func asArray(Array) {} func asBool(Bool) {} func asChan(Chan) {} func asFloat(Float) {} func asInt(Int) {} func asMap(Map) {} func asSlice(Slice) {} func asString(String) {} func (Map) M() {} // These functions check at run time that the default type // (in the absence of any implicit conversion hints) // is the given type. func isArray(x interface{}) { _ = x.(Array) } func isBool(x interface{}) { _ = x.(Bool) } func isChan(x interface{}) { _ = x.(Chan) } func isFloat(x interface{}) { _ = x.(Float) } func isInt(x interface{}) { _ = x.(Int) } func isMap(x interface{}) { _ = x.(Map) } func isSlice(x interface{}) { _ = x.(Slice) } func isString(x interface{}) { _ = x.(String) } func main() { var ( a Array; b Bool = true; c Chan = make(Chan); f Float = 1; i Int = 1; m Map = make(Map); slice Slice = make(Slice, 10); str String = "hello"; ) asArray(a); isArray(a); asArray(*&a); isArray(*&a); asArray(Array{}); isArray(Array{}); asBool(b); isBool(b); asBool(!b); isBool(!b); asBool(true); asBool(*&b); isBool(*&b); asBool(Bool(true)); isBool(Bool(true)); asChan(c); isChan(c); asChan(make(Chan)); isChan(make(Chan)); asChan(*&c); isChan(*&c); asChan(Chan(nil)); isChan(Chan(nil)); asFloat(f); isFloat(f); asFloat(-f); isFloat(-f); asFloat(+f); isFloat(+f); asFloat(f+1); isFloat(f+1); asFloat(1+f); isFloat(1+f); asFloat(f+f); isFloat(f+f); f++; f+=2; asFloat(f-1); isFloat(f-1); asFloat(1-f); isFloat(1-f); asFloat(f-f); isFloat(f-f); f--; f-=2; asFloat(f*2.5); isFloat(f*2.5); asFloat(2.5*f); isFloat(2.5*f); asFloat(f*f); isFloat(f*f); f*=4; asFloat(f/2.5); isFloat(f/2.5); asFloat(2.5/f); isFloat(2.5/f); asFloat(f/f); isFloat(f/f); f/=4; asFloat(f); isFloat(f); f = 5; asFloat(*&f); isFloat(*&f); asFloat(234); asFloat(Float(234)); isFloat(Float(234)); asFloat(1.2); asFloat(Float(i)); isFloat(Float(i)); asInt(i); isInt(i); asInt(-i); isInt(-i); asInt(^i); isInt(^i); asInt(+i); isInt(+i); asInt(i+1); isInt(i+1); asInt(1+i); isInt(1+i); asInt(i+i); isInt(i+i); i++; i+=1; asInt(i-1); isInt(i-1); asInt(1-i); isInt(1-i); asInt(i-i); isInt(i-i); i--; i-=1; asInt(i*2); isInt(i*2); asInt(2*i); isInt(2*i); asInt(i*i); isInt(i*i); i*=2; asInt(i/5); isInt(i/5); asInt(5/i); isInt(5/i); asInt(i/i); isInt(i/i); i/=2; asInt(i%5); isInt(i%5); asInt(5%i); isInt(5%i); asInt(i%i); isInt(i%i); i%=2; asInt(i&5); isInt(i&5); asInt(5&i); isInt(5&i); asInt(i&i); isInt(i&i); i&=2; asInt(i&^5); isInt(i&^5); asInt(5&^i); isInt(5&^i); asInt(i&^i); isInt(i&^i); i&^=2; asInt(i|5); isInt(i|5); asInt(5|i); isInt(5|i); asInt(i|i); isInt(i|i); i|=2; asInt(i^5); isInt(i^5); asInt(5^i); isInt(5^i); asInt(i^i); isInt(i^i); i^=2; asInt(i<<4); isInt(i<<4); i<<=2; asInt(i>>4); isInt(i>>4); i>>=2; asInt(i); isInt(i); asInt(0); asInt(Int(0)); isInt(Int(0)); i = 10; asInt(*&i); isInt(*&i); asInt(23); asInt(Int(f)); isInt(Int(f)); asMap(m); isMap(m); asMap(nil); m = nil; asMap(make(Map)); isMap(make(Map)); asMap(*&m); isMap(*&m); asMap(Map(nil)); isMap(Map(nil)); asMap(Map{}); isMap(Map{}); asSlice(slice); isSlice(slice); asSlice(make(Slice, 5)); isSlice(make(Slice, 5)); asSlice([]byte{1,2,3}); asSlice([]byte{1,2,3}[0:2]); asSlice(slice[0:4]); isSlice(slice[0:4]); asSlice(slice[3:8]); isSlice(slice[3:8]); asSlice(nil); asSlice(Slice(nil)); isSlice(Slice(nil)); slice = nil; asSlice(Slice{1,2,3}); isSlice(Slice{1,2,3}); asSlice(Slice{}); isSlice(Slice{}); asSlice(*&slice); isSlice(*&slice); asString(str); isString(str); asString(str+"a"); isString(str+"a"); asString("a"+str); isString("a"+str); asString(str+str); isString(str+str); str += "a"; str += str; asString(String('a')); isString(String('a')); asString(String(slice)); isString(String(slice)); asString(String([]byte(nil))); isString(String([]byte(nil))); asString("hello"); asString(String("hello")); isString(String("hello")); str = "hello"; isString(str); asString(*&str); isString(*&str); }