mirror of
https://github.com/golang/go
synced 2024-11-21 12:34:38 -07:00
a457fa500d
This is a manual undo of CL 5674098. It does not implement the even less strict spec that we just agreed on, but it gets us back where we were at the last weekly. R=ken2 CC=golang-dev https://golang.org/cl/5683069
282 lines
4.6 KiB
Go
282 lines
4.6 KiB
Go
// 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)
|
|
}
|