1// run
2
3// Copyright 2010 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// Test complex numbers,including fmt support.
8// Used to crash.
9
10package main
11
12import "fmt"
13
14const (
15	R = 5
16	I = 6i
17
18	C1 = R + I // ADD(5,6)
19)
20
21func want(s, w string) {
22	if s != w {
23		panic(s + " != " + w)
24	}
25}
26
27func doprint(c complex128, w string) {
28	s := fmt.Sprintf("%f", c)
29	want(s, w)
30}
31
32func main() {
33
34	// constants
35	s := fmt.Sprintf("%f", -C1)
36	want(s, "(-5.000000-6.000000i)")
37	doprint(C1, "(5.000000+6.000000i)")
38
39	// variables
40	c1 := C1
41	s = fmt.Sprintf("%f", c1)
42	want(s, "(5.000000+6.000000i)")
43	doprint(c1, "(5.000000+6.000000i)")
44
45	// 128
46	c2 := complex128(C1)
47	s = fmt.Sprintf("%G", c2)
48	want(s, "(5+6i)")
49
50	// real, imag, complex
51	c3 := complex(real(c2)+3, imag(c2)-5) + c2
52	s = fmt.Sprintf("%G", c3)
53	want(s, "(13+7i)")
54
55	// compiler used to crash on nested divide
56	c4 := complex(real(c3/2), imag(c3/2))
57	if c4 != c3/2 {
58		fmt.Printf("BUG: c3 = %G != c4 = %G\n", c3, c4)
59		panic(0)
60	}
61}
62