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>    complex<T>           proj(const complex<T>&);
13//                      complex<long double> proj(long double);
14//                      complex<double>      proj(double);
15// template<Integral T> complex<double>      proj(T);
16//                      complex<float>       proj(float);
17
18#include <complex>
19#include <type_traits>
20#include <cassert>
21
22#include "../cases.h"
23
24template <class T>
25void
26test(T x, typename std::enable_if<std::is_integral<T>::value>::type* = 0)
27{
28    static_assert((std::is_same<decltype(std::proj(x)), std::complex<double> >::value), "");
29    assert(std::proj(x) == proj(std::complex<double>(x, 0)));
30}
31
32template <class T>
33void
34test(T x, typename std::enable_if<std::is_floating_point<T>::value>::type* = 0)
35{
36    static_assert((std::is_same<decltype(std::proj(x)), std::complex<T> >::value), "");
37    assert(std::proj(x) == proj(std::complex<T>(x, 0)));
38}
39
40template <class T>
41void
42test(T x, typename std::enable_if<!std::is_integral<T>::value &&
43                                  !std::is_floating_point<T>::value>::type* = 0)
44{
45    static_assert((std::is_same<decltype(std::proj(x)), std::complex<T> >::value), "");
46    assert(std::proj(x) == proj(std::complex<T>(x, 0)));
47}
48
49template <class T>
50void
51test()
52{
53    test<T>(0);
54    test<T>(1);
55    test<T>(10);
56}
57
58int main()
59{
60    test<float>();
61    test<double>();
62    test<long double>();
63    test<int>();
64    test<unsigned>();
65    test<long long>();
66}
67