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