1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <complex>
10 
11 // template<class T>
12 //   complex<T>
13 //   __sqr(const complex<T>& x);
14 
15 #include <complex>
16 #include <cassert>
17 
18 #include "test_macros.h"
19 
20 template <class T>
21 void
test()22 test()
23 {
24     const T tolerance = std::is_same<T, float>::value ? 1.e-6 : 1.e-14;
25 
26     typedef std::complex<T> cplx;
27     struct test_case
28     {
29         cplx value;
30         cplx expected;
31     };
32 
33     const test_case cases[] = {
34         {cplx( 0,  0), cplx( 0,  0)},
35         {cplx( 1,  0), cplx( 1,  0)},
36         {cplx( 2,  0), cplx( 4,  0)},
37         {cplx(-1,  0), cplx( 1,  0)},
38         {cplx( 0,  1), cplx(-1,  0)},
39         {cplx( 0,  2), cplx(-4,  0)},
40         {cplx( 0, -1), cplx(-1,  0)},
41         {cplx( 1,  1), cplx( 0,  2)},
42         {cplx( 1, -1), cplx( 0, -2)},
43         {cplx(-1, -1), cplx( 0,  2)},
44         {cplx(0.5, 0), cplx(0.25, 0)},
45     };
46 
47     const unsigned num_cases = sizeof(cases) / sizeof(test_case);
48     for (unsigned i = 0; i < num_cases; ++i)
49     {
50         const test_case& test = cases[i];
51         const std::complex<T> actual = std::__sqr(test.value);
52         assert(std::abs(actual.real() - test.expected.real()) < tolerance);
53         assert(std::abs(actual.imag() - test.expected.imag()) < tolerance);
54     }
55 
56     const cplx nan1 = std::__sqr(cplx(NAN, 0));
57     assert(std::isnan(nan1.real()));
58     assert(std::isnan(nan1.imag()));
59 
60     const cplx nan2 = std::__sqr(cplx(0, NAN));
61     assert(std::isnan(nan2.real()));
62     assert(std::isnan(nan2.imag()));
63 
64     const cplx nan3 = std::__sqr(cplx(NAN, NAN));
65     assert(std::isnan(nan3.real()));
66     assert(std::isnan(nan3.imag()));
67 
68     const cplx inf1 = std::__sqr(cplx(INFINITY, 0));
69     assert(std::isinf(inf1.real()));
70     assert(inf1.real() > 0);
71 
72     const cplx inf2 = std::__sqr(cplx(0, INFINITY));
73     assert(std::isinf(inf2.real()));
74     assert(inf2.real() < 0);
75 }
76 
main(int,char **)77 int main(int, char**)
78 {
79     test<float>();
80     test<double>();
81     test<long double>();
82 
83   return 0;
84 }
85