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