| // $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); | 
 | } |