brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · d12dfd9 Raw
167 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>12//   complex<T>13//   operator/(const complex<T>& lhs, const complex<T>& rhs); // constexpr in C++2014 15// ADDITIONAL_COMPILE_FLAGS(has-fconstexpr-steps): -fconstexpr-steps=200000016 17#include <cassert>18#include <complex>19 20#include "floating_pointer_helpers.h"21#include "test_macros.h"22#include "../cases.h"23 24template <class T>25TEST_CONSTEXPR_CXX2026bool27test()28{29    const std::complex<T> lhs(-4.0, 7.5);30    const std::complex<T> rhs(1.5, 2.5);31    const std::complex<T> c = lhs / rhs;32    assert(is_close(c.real(), T(1.5)));33    assert(is_close(c.imag(), T(2.5)));34    return true;35}36 37TEST_CONSTEXPR_CXX2038bool39test_edges()40{41  const unsigned N = sizeof(testcases) / sizeof(testcases[0]);42  int classification[N];43  for (unsigned i=0; i < N; ++i)44    classification[i] = classify(testcases[i]);45 46  for (unsigned i = 0; i < N; ++i) {47    for (unsigned j = 0; j < N; ++j) {48      std::complex<double> r = testcases[i] / testcases[j];49      switch (classification[i]) {50      case zero:51        switch (classification[j]) {52        case zero:53          assert(classify(r) == NaN);54          break;55        case non_zero:56          assert(classify(r) == zero);57          break;58        case inf:59          assert(classify(r) == zero);60          break;61        case NaN:62          assert(classify(r) == NaN);63          break;64        case non_zero_nan:65          assert(classify(r) == NaN);66          break;67        }68        break;69      case non_zero:70        switch (classification[j]) {71        case zero:72          assert(classify(r) == inf);73          break;74        case non_zero:75          assert(classify(r) == non_zero);76          break;77        case inf:78          assert(classify(r) == zero);79          break;80        case NaN:81          assert(classify(r) == NaN);82          break;83        case non_zero_nan:84          assert(classify(r) == NaN);85          break;86        }87        break;88      case inf:89        switch (classification[j]) {90        case zero:91          assert(classify(r) == inf);92          break;93        case non_zero:94          assert(classify(r) == inf);95          break;96        case inf:97          assert(classify(r) == NaN);98          break;99        case NaN:100          assert(classify(r) == NaN);101          break;102        case non_zero_nan:103          assert(classify(r) == NaN);104          break;105        }106        break;107      case NaN:108        switch (classification[j]) {109        case zero:110          assert(classify(r) == NaN);111          break;112        case non_zero:113          assert(classify(r) == NaN);114          break;115        case inf:116          assert(classify(r) == NaN);117          break;118        case NaN:119          assert(classify(r) == NaN);120          break;121        case non_zero_nan:122          assert(classify(r) == NaN);123          break;124        }125        break;126      case non_zero_nan:127        switch (classification[j]) {128        case zero:129          assert(classify(r) == inf);130          break;131        case non_zero:132          assert(classify(r) == NaN);133          break;134        case inf:135          assert(classify(r) == NaN);136          break;137        case NaN:138          assert(classify(r) == NaN);139          break;140        case non_zero_nan:141          assert(classify(r) == NaN);142          break;143        }144        break;145      }146    }147  }148  return true;149}150 151int main(int, char**)152{153    test<float>();154    test<double>();155    test<long double>();156    test_edges();157 158#if TEST_STD_VER > 17159    static_assert(test<float>());160    static_assert(test<double>());161    static_assert(test<long double>());162    static_assert(test_edges());163#endif164 165    return 0;166}167