const.go 4.78 KB
Newer Older
Russ Cox's avatar
Russ Cox committed
1
// run
Rob Pike's avatar
Rob Pike committed
2 3 4 5 6

// 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.

7 8
// Test simple boolean and numeric constants.

Rob Pike's avatar
Rob Pike committed
9 10
package main

11 12
import "os"

Rob Pike's avatar
Rob Pike committed
13
const (
14 15 16
	c0      = 0
	cm1     = -1
	chuge   = 1 << 100
Rob Pike's avatar
Rob Pike committed
17
	chuge_1 = chuge - 1
18 19 20
	c1      = chuge >> 100
	c3div2  = 3 / 2
	c1e3    = 1e3
21

22 23 24
	rsh1 = 1e100 >> 1000
	rsh2 = 1e302 >> 1000

25
	ctrue  = true
Rob Pike's avatar
Rob Pike committed
26
	cfalse = !ctrue
27 28 29 30

	// Issue #34563
	_ = string(int(123))
	_ = string(rune(456))
Rob Pike's avatar
Rob Pike committed
31 32 33
)

const (
34 35 36
	f0              = 0.0
	fm1             = -1.
	fhuge   float64 = 1 << 100
Rob Pike's avatar
Rob Pike committed
37
	fhuge_1 float64 = chuge - 1
38 39 40
	f1      float64 = chuge >> 100
	f3div2          = 3. / 2.
	f1e3    float64 = 1e3
Rob Pike's avatar
Rob Pike committed
41 42 43 44 45 46 47 48 49
)

func assert(t bool, s string) {
	if !t {
		panic(s)
	}
}

func ints() {
Rob Pike's avatar
Rob Pike committed
50 51 52
	assert(c0 == 0, "c0")
	assert(c1 == 1, "c1")
	assert(chuge > chuge_1, "chuge")
53 54
	assert(chuge_1+1 == chuge, "chuge 1")
	assert(chuge+cm1+1 == chuge, "cm1")
Rob Pike's avatar
Rob Pike committed
55 56 57
	assert(c3div2 == 1, "3/2")
	assert(c1e3 == 1000, "c1e3 int")
	assert(c1e3 == 1e3, "c1e3 float")
58 59
	assert(rsh1 == 0, "rsh1")
	assert(rsh2 == 9, "rsh2")
Rob Pike's avatar
Rob Pike committed
60 61

	// verify that all (in range) are assignable as ints
Rob Pike's avatar
Rob Pike committed
62 63 64 65 66 67 68 69 70 71 72
	var i int
	i = c0
	assert(i == c0, "i == c0")
	i = cm1
	assert(i == cm1, "i == cm1")
	i = c1
	assert(i == c1, "i == c1")
	i = c3div2
	assert(i == c3div2, "i == c3div2")
	i = c1e3
	assert(i == c1e3, "i == c1e3")
Rob Pike's avatar
Rob Pike committed
73 74

	// verify that all are assignable as floats
Rob Pike's avatar
Rob Pike committed
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
	var f float64
	f = c0
	assert(f == c0, "f == c0")
	f = cm1
	assert(f == cm1, "f == cm1")
	f = chuge
	assert(f == chuge, "f == chuge")
	f = chuge_1
	assert(f == chuge_1, "f == chuge_1")
	f = c1
	assert(f == c1, "f == c1")
	f = c3div2
	assert(f == c3div2, "f == c3div2")
	f = c1e3
	assert(f == c1e3, "f == c1e3")
Rob Pike's avatar
Rob Pike committed
90 91 92
}

func floats() {
Rob Pike's avatar
Rob Pike committed
93 94
	assert(f0 == c0, "f0")
	assert(f1 == c1, "f1")
95 96 97 98 99 100
	// TODO(gri): exp/ssa/interp constant folding is incorrect.
	if os.Getenv("GOSSAINTERP") == "" {
		assert(fhuge == fhuge_1, "fhuge") // float64 can't distinguish fhuge, fhuge_1.
	}
	assert(fhuge_1+1 == fhuge, "fhuge 1")
	assert(fhuge+fm1+1 == fhuge, "fm1")
Rob Pike's avatar
Rob Pike committed
101 102 103
	assert(f3div2 == 1.5, "3./2.")
	assert(f1e3 == 1000, "f1e3 int")
	assert(f1e3 == 1.e3, "f1e3 float")
Rob Pike's avatar
Rob Pike committed
104 105

	// verify that all (in range) are assignable as ints
Rob Pike's avatar
Rob Pike committed
106 107 108 109 110
	var i int
	i = f0
	assert(i == f0, "i == f0")
	i = fm1
	assert(i == fm1, "i == fm1")
Rob Pike's avatar
Rob Pike committed
111 112

	// verify that all are assignable as floats
Rob Pike's avatar
Rob Pike committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
	var f float64
	f = f0
	assert(f == f0, "f == f0")
	f = fm1
	assert(f == fm1, "f == fm1")
	f = fhuge
	assert(f == fhuge, "f == fhuge")
	f = fhuge_1
	assert(f == fhuge_1, "f == fhuge_1")
	f = f1
	assert(f == f1, "f == f1")
	f = f3div2
	assert(f == f3div2, "f == f3div2")
	f = f1e3
	assert(f == f1e3, "f == f1e3")
Rob Pike's avatar
Rob Pike committed
128 129
}

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
func interfaces() {
	var (
		nilN interface{}
		nilI *int
		five = 5

		_ = nil == interface{}(nil)
		_ = interface{}(nil) == nil
	)
	ii := func(i1 interface{}, i2 interface{}) bool { return i1 == i2 }
	ni := func(n interface{}, i int) bool { return n == i }
	in := func(i int, n interface{}) bool { return i == n }
	pi := func(p *int, i interface{}) bool { return p == i }
	ip := func(i interface{}, p *int) bool { return i == p }

	assert((interface{}(nil) == interface{}(nil)) == ii(nilN, nilN),
		"for interface{}==interface{} compiler == runtime")

	assert(((*int)(nil) == interface{}(nil)) == pi(nilI, nilN),
		"for *int==interface{} compiler == runtime")
	assert((interface{}(nil) == (*int)(nil)) == ip(nilN, nilI),
		"for interface{}==*int compiler == runtime")

	assert((&five == interface{}(nil)) == pi(&five, nilN),
		"for interface{}==*int compiler == runtime")
	assert((interface{}(nil) == &five) == ip(nilN, &five),
		"for interface{}==*int compiler == runtime")

	assert((5 == interface{}(5)) == ni(five, five),
		"for int==interface{} compiler == runtime")
	assert((interface{}(5) == 5) == in(five, five),
		"for interface{}==int comipiler == runtime")
}

164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
// Test that typed floating-point and complex arithmetic
// is computed with correct precision.
func truncate() {
	const (
		x30 = 1 << 30
		x60 = 1 << 60

		staticF32 = float32(x30) + 1 - x30
		staticF64 = float64(x60) + 1 - x60
		staticC64 = complex64(x30) + 1 - x30
		staticC128 = complex128(x60) + 1 - x60
	)
	dynamicF32 := float32(x30)
	dynamicF32 += 1
	dynamicF32 -= x30

	dynamicF64 := float64(x60)
	dynamicF64 += 1
	dynamicF64 -= x60

	dynamicC64 := complex64(x30)
	dynamicC64 += 1
	dynamicC64 -= x30

	dynamicC128 := complex128(x60)
	dynamicC128 += 1
	dynamicC128 -= x60

	assert(staticF32 == 0, "staticF32 == 0")
	assert(staticF64 == 0, "staticF64 == 0")
	assert(dynamicF32 == 0, "dynamicF32 == 0")
	assert(dynamicF64 == 0, "dynamicF64 == 0")
	assert(staticC64 == 0, "staticC64 == 0")
	assert(staticC128 == 0, "staticC128 == 0")
	assert(dynamicC64 == 0, "dynamicC64 == 0")
	assert(dynamicC128 == 0, "dynamicC128 == 0")
}

Rob Pike's avatar
Rob Pike committed
202
func main() {
Rob Pike's avatar
Rob Pike committed
203 204
	ints()
	floats()
205
	interfaces()
206
	truncate()
207

Rob Pike's avatar
Rob Pike committed
208 209
	assert(ctrue == true, "ctrue == true")
	assert(cfalse == false, "cfalse == false")
Rob Pike's avatar
Rob Pike committed
210
}