1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <complex>
11
12// template<class T>
13//   complex<T>
14//   operator*(const complex<T>& lhs, const complex<T>& rhs);
15
16#include <complex>
17#include <cassert>
18
19#include "../cases.h"
20
21template <class T>
22void
23test(const std::complex<T>& lhs, const std::complex<T>& rhs, std::complex<T> x)
24{
25    assert(lhs * rhs == x);
26}
27
28template <class T>
29void
30test()
31{
32    std::complex<T> lhs(1.5, 2.5);
33    std::complex<T> rhs(1.5, 2.5);
34    std::complex<T>   x(-4.0, 7.5);
35    test(lhs, rhs, x);
36}
37
38// test edges
39
40void test_edges()
41{
42    const unsigned N = sizeof(x) / sizeof(x[0]);
43    for (unsigned i = 0; i < N; ++i)
44    {
45        for (unsigned j = 0; j < N; ++j)
46        {
47            std::complex<double> r = x[i] * x[j];
48            switch (classify(x[i]))
49            {
50            case zero:
51                switch (classify(x[j]))
52                {
53                case zero:
54                    assert(classify(r) == zero);
55                    break;
56                case non_zero:
57                    assert(classify(r) == zero);
58                    break;
59                case inf:
60                    assert(classify(r) == NaN);
61                    break;
62                case NaN:
63                    assert(classify(r) == NaN);
64                    break;
65                case non_zero_nan:
66                    assert(classify(r) == NaN);
67                    break;
68                }
69                break;
70            case non_zero:
71                switch (classify(x[j]))
72                {
73                case zero:
74                    assert(classify(r) == zero);
75                    break;
76                case non_zero:
77                    assert(classify(r) == non_zero);
78                    break;
79                case inf:
80                    assert(classify(r) == inf);
81                    break;
82                case NaN:
83                    assert(classify(r) == NaN);
84                    break;
85                case non_zero_nan:
86                    assert(classify(r) == NaN);
87                    break;
88                }
89                break;
90            case inf:
91                switch (classify(x[j]))
92                {
93                case zero:
94                    assert(classify(r) == NaN);
95                    break;
96                case non_zero:
97                    assert(classify(r) == inf);
98                    break;
99                case inf:
100                    assert(classify(r) == inf);
101                    break;
102                case NaN:
103                    assert(classify(r) == NaN);
104                    break;
105                case non_zero_nan:
106                    assert(classify(r) == inf);
107                    break;
108                }
109                break;
110            case NaN:
111                switch (classify(x[j]))
112                {
113                case zero:
114                    assert(classify(r) == NaN);
115                    break;
116                case non_zero:
117                    assert(classify(r) == NaN);
118                    break;
119                case inf:
120                    assert(classify(r) == NaN);
121                    break;
122                case NaN:
123                    assert(classify(r) == NaN);
124                    break;
125                case non_zero_nan:
126                    assert(classify(r) == NaN);
127                    break;
128                }
129                break;
130            case non_zero_nan:
131                switch (classify(x[j]))
132                {
133                case zero:
134                    assert(classify(r) == NaN);
135                    break;
136                case non_zero:
137                    assert(classify(r) == NaN);
138                    break;
139                case inf:
140                    assert(classify(r) == inf);
141                    break;
142                case NaN:
143                    assert(classify(r) == NaN);
144                    break;
145                case non_zero_nan:
146                    assert(classify(r) == NaN);
147                    break;
148                }
149                break;
150            }
151        }
152    }
153}
154
155int main()
156{
157    test<float>();
158    test<double>();
159    test<long double>();
160    test_edges();
161}
162