1// run
2
3// Copyright 2018 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// (-0)+0 should be 0, not -0.
8
9package main
10
11//go:noinline
12func add64(x float64) float64 {
13	return x + 0
14}
15
16func testAdd64() {
17	var zero float64
18	inf := 1.0 / zero
19	negZero := -1 / inf
20	if 1/add64(negZero) != inf {
21		panic("negZero+0 != posZero (64 bit)")
22	}
23}
24
25//go:noinline
26func sub64(x float64) float64 {
27	return x - 0
28}
29
30func testSub64() {
31	var zero float64
32	inf := 1.0 / zero
33	negZero := -1 / inf
34	if 1/sub64(negZero) != -inf {
35		panic("negZero-0 != negZero (64 bit)")
36	}
37}
38
39//go:noinline
40func neg64(x float64) float64 {
41	return -x
42}
43
44func testNeg64() {
45	var zero float64
46	inf := 1.0 / zero
47	negZero := -1 / inf
48	if 1/neg64(negZero) != inf {
49		panic("-negZero != posZero (64 bit)")
50	}
51}
52
53//go:noinline
54func add32(x float32) float32 {
55	return x + 0
56}
57
58func testAdd32() {
59	var zero float32
60	inf := 1.0 / zero
61	negZero := -1 / inf
62	if 1/add32(negZero) != inf {
63		panic("negZero+0 != posZero (32 bit)")
64	}
65}
66
67//go:noinline
68func sub32(x float32) float32 {
69	return x - 0
70}
71
72func testSub32() {
73	var zero float32
74	inf := 1.0 / zero
75	negZero := -1 / inf
76	if 1/sub32(negZero) != -inf {
77		panic("negZero-0 != negZero (32 bit)")
78	}
79}
80
81//go:noinline
82func neg32(x float32) float32 {
83	return -x
84}
85
86func testNeg32() {
87	var zero float32
88	inf := 1.0 / zero
89	negZero := -1 / inf
90	if 1/neg32(negZero) != inf {
91		panic("-negZero != posZero (32 bit)")
92	}
93}
94
95func main() {
96	testAdd64()
97	testSub64()
98	testNeg64()
99	testAdd32()
100	testSub32()
101	testNeg32()
102}
103