blob: 9763c76bfdf278ec98d60f2d1802ec1aee14105b [file] [log] [blame]
// run
// 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 float32
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([]byte(slice)))
isString(String([]byte(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)
}