83 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <complex>10 11// template<class T> complex<T> conj(const complex<T>&); // constexpr in C++2012// complex<long double> conj(long double); // constexpr in C++2013// complex<double> conj(double); // constexpr in C++2014// template<Integral T> complex<double> conj(T); // constexpr in C++2015// complex<float> conj(float); // constexpr in C++2016 17#include <complex>18#include <type_traits>19#include <cassert>20 21#include "test_macros.h"22#include "../cases.h"23 24template <class T>25TEST_CONSTEXPR_CXX2026void27test(T x, typename std::enable_if<std::is_integral<T>::value>::type* = 0)28{29 static_assert((std::is_same<decltype(std::conj(x)), std::complex<double> >::value), "");30 assert(std::conj(x) == conj(std::complex<double>(x, 0)));31}32 33template <class T>34TEST_CONSTEXPR_CXX2035void36test(T x, typename std::enable_if<std::is_floating_point<T>::value>::type* = 0)37{38 static_assert((std::is_same<decltype(std::conj(x)), std::complex<T> >::value), "");39 assert(std::conj(x) == conj(std::complex<T>(x, 0)));40}41 42template <class T>43TEST_CONSTEXPR_CXX2044void45test(T x, typename std::enable_if<!std::is_integral<T>::value &&46 !std::is_floating_point<T>::value>::type* = 0)47{48 static_assert((std::is_same<decltype(std::conj(x)), std::complex<T> >::value), "");49 assert(std::conj(x) == conj(std::complex<T>(x, 0)));50}51 52template <class T>53TEST_CONSTEXPR_CXX2054bool55test()56{57 test<T>(0);58 test<T>(1);59 test<T>(10);60 return true;61}62 63int main(int, char**)64{65 test<float>();66 test<double>();67 test<long double>();68 test<int>();69 test<unsigned>();70 test<long long>();71 72#if TEST_STD_VER >= 2073 static_assert(test<float>());74 static_assert(test<double>());75 static_assert(test<long double>());76 static_assert(test<int>());77 static_assert(test<unsigned>());78 static_assert(test<long long>());79#endif80 81 return 0;82}83