15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <complex>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // template<class T> complex<T> conj(const complex<T>&);
125a83710eSEric Fiselier // complex<long double> conj(long double);
135a83710eSEric Fiselier // complex<double> conj(double);
145a83710eSEric Fiselier // template<Integral T> complex<double> conj(T);
155a83710eSEric Fiselier // complex<float> conj(float);
165a83710eSEric Fiselier
175a83710eSEric Fiselier #include <complex>
185a83710eSEric Fiselier #include <type_traits>
195a83710eSEric Fiselier #include <cassert>
205a83710eSEric Fiselier
21*7fc6a556SMarshall Clow #include "test_macros.h"
225a83710eSEric Fiselier #include "../cases.h"
235a83710eSEric Fiselier
245a83710eSEric Fiselier template <class T>
255a83710eSEric Fiselier void
test(T x,typename std::enable_if<std::is_integral<T>::value>::type * =0)265a83710eSEric Fiselier test(T x, typename std::enable_if<std::is_integral<T>::value>::type* = 0)
275a83710eSEric Fiselier {
285a83710eSEric Fiselier static_assert((std::is_same<decltype(std::conj(x)), std::complex<double> >::value), "");
295a83710eSEric Fiselier assert(std::conj(x) == conj(std::complex<double>(x, 0)));
305a83710eSEric Fiselier }
315a83710eSEric Fiselier
325a83710eSEric Fiselier template <class T>
335a83710eSEric Fiselier void
test(T x,typename std::enable_if<std::is_floating_point<T>::value>::type * =0)345a83710eSEric Fiselier test(T x, typename std::enable_if<std::is_floating_point<T>::value>::type* = 0)
355a83710eSEric Fiselier {
365a83710eSEric Fiselier static_assert((std::is_same<decltype(std::conj(x)), std::complex<T> >::value), "");
375a83710eSEric Fiselier assert(std::conj(x) == conj(std::complex<T>(x, 0)));
385a83710eSEric Fiselier }
395a83710eSEric Fiselier
405a83710eSEric Fiselier template <class T>
415a83710eSEric Fiselier void
test(T x,typename std::enable_if<!std::is_integral<T>::value &&!std::is_floating_point<T>::value>::type * =0)425a83710eSEric Fiselier test(T x, typename std::enable_if<!std::is_integral<T>::value &&
435a83710eSEric Fiselier !std::is_floating_point<T>::value>::type* = 0)
445a83710eSEric Fiselier {
455a83710eSEric Fiselier static_assert((std::is_same<decltype(std::conj(x)), std::complex<T> >::value), "");
465a83710eSEric Fiselier assert(std::conj(x) == conj(std::complex<T>(x, 0)));
475a83710eSEric Fiselier }
485a83710eSEric Fiselier
495a83710eSEric Fiselier template <class T>
505a83710eSEric Fiselier void
test()515a83710eSEric Fiselier test()
525a83710eSEric Fiselier {
535a83710eSEric Fiselier test<T>(0);
545a83710eSEric Fiselier test<T>(1);
555a83710eSEric Fiselier test<T>(10);
565a83710eSEric Fiselier }
575a83710eSEric Fiselier
main(int,char **)582df59c50SJF Bastien int main(int, char**)
595a83710eSEric Fiselier {
605a83710eSEric Fiselier test<float>();
615a83710eSEric Fiselier test<double>();
625a83710eSEric Fiselier test<long double>();
635a83710eSEric Fiselier test<int>();
645a83710eSEric Fiselier test<unsigned>();
655a83710eSEric Fiselier test<long long>();
662df59c50SJF Bastien
672df59c50SJF Bastien return 0;
685a83710eSEric Fiselier }
69