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
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template<class T>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   T
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   arg(const complex<T>& x);
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()
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    std::complex<T> z(1, 0);
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(arg(z) == 0);
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test_edges()
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const double pi = std::atan2(+0., -0.);
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned N = sizeof(x) / sizeof(x[0]);
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < N; ++i)
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        double r = arg(x[i]);
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (std::isnan(x[i].real()) || std::isnan(x[i].imag()))
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(std::isnan(r));
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (classify(x[i]))
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case zero:
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (std::signbit(x[i].real()))
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    if (std::signbit(x[i].imag()))
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        is_about(r, -pi);
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    else
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        is_about(r, pi);
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                else
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    assert(std::signbit(x[i].imag()) == std::signbit(r));
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case non_zero:
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (x[i].real() == 0)
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    if (x[i].imag() < 0)
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        is_about(r, -pi/2);
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    else
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        is_about(r, pi/2);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                else if (x[i].imag() == 0)
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    if (x[i].real() < 0)
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    {
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        if (std::signbit(x[i].imag()))
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, -pi);
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        else
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, pi);
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    }
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    else
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    {
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        assert(r == 0);
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        assert(std::signbit(x[i].imag()) == std::signbit(r));
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    }
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                else if (x[i].imag() > 0)
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    assert(r > 0);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                else
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    assert(r < 0);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case inf:
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (std::isinf(x[i].real()) && std::isinf(x[i].imag()))
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    if (x[i].real() < 0)
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    {
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        if (x[i].imag() > 0)
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, 0.75 * pi);
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        else
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, -0.75 * pi);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    }
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    else
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    {
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        if (x[i].imag() > 0)
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, 0.25 * pi);
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        else
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, -0.25 * pi);
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    }
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                else if (std::isinf(x[i].real()))
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    if (x[i].real() < 0)
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    {
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        if (std::signbit(x[i].imag()))
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, -pi);
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        else
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            is_about(r, pi);
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    }
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    else
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    {
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        assert(r == 0);
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        assert(std::signbit(r) == std::signbit(x[i].imag()));
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    }
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                else
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    if (x[i].imag() < 0)
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        is_about(r, -pi/2);
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    else
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        is_about(r, pi/2);
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<float>();
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<double>();
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<long double>();
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_edges();
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
136