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