brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 6cafbfb Raw
121 lines · c
1// RUN: %clang_cc1 -verify=no-diag %s2// RUN: %clang_cc1 -complex-range=promoted -triple x86_64-unknown-linux \3// RUN: -verify=no-diag %s4// RUN: %clang_cc1 -complex-range=promoted -triple x86_64-unknown-windows \5// RUN: -verify=div-precision %s6// no-diag-no-diagnostics7 8// This tests evaluation of _Complex arithmetic at compile time.9 10#define APPROX_EQ(a, b) (                             \11  __builtin_fabs(__real (a) - __real (b)) < 0.0001 && \12  __builtin_fabs(__imag (a) - __imag (b)) < 0.0001    \13)14 15#define EVAL(a, b) _Static_assert(a == b, "")16#define EVALF(a, b) _Static_assert(APPROX_EQ(a, b), "")17 18// _Complex float + _Complex float19void a() {20  EVALF((2.f + 3i) + (4.f + 5i), 6.f + 8i);21  EVALF((2.f + 3i) - (4.f + 5i), -2.f - 2i);22  EVALF((2.f + 3i) * (4.f + 5i), -7.f + 22i);23  EVALF((2.f + 3i) / (4.f + 5i), 0.5609f + 0.0487i);24 25  EVALF((2. + 3i) + (4. + 5i), 6. + 8i);26  EVALF((2. + 3i) - (4. + 5i), -2. - 2i);27  EVALF((2. + 3i) * (4. + 5i), -7. + 22i);28  // div-precision-warning@+1 {{excess precision is requested but the target does not support excess precision which may result in observable differences in complex division behavior, additional uses where the requested higher precision cannot be honored were found but not diagnosed}}29  EVALF((2. + 3i) / (4. + 5i), .5609 + .0487i);30}31 32// _Complex int + _Complex int33void b() {34  EVAL((2 + 3i) + (4 + 5i), 6 + 8i);35  EVAL((2 + 3i) - (4 + 5i), -2 - 2i);36  EVAL((2 + 3i) * (4 + 5i), -7 + 22i);37  EVAL((8 + 30i) / (4 + 5i), 4 + 1i);38}39 40// _Complex float + float41void c() {42  EVALF((2.f + 4i) + 3.f, 5.f + 4i);43  EVALF((2.f + 4i) - 3.f, -1.f + 4i);44  EVALF((2.f + 4i) * 3.f, 6.f + 12i);45  EVALF((2.f + 4i) / 2.f, 1.f + 2i);46 47  EVALF(3.f + (2.f + 4i), 5.f + 4i);48  EVALF(3.f - (2.f + 4i), 1.f - 4i);49  EVALF(3.f * (2.f + 4i), 6.f + 12i);50  EVALF(3.f / (2.f + 4i), .3f - 0.6i);51 52  EVALF((2. + 4i) + 3., 5. + 4i);53  EVALF((2. + 4i) - 3., -1. + 4i);54  EVALF((2. + 4i) * 3., 6. + 12i);55  EVALF((2. + 4i) / 2., 1. + 2i);56 57  EVALF(3. + (2. + 4i), 5. + 4i);58  EVALF(3. - (2. + 4i), 1. - 4i);59  EVALF(3. * (2. + 4i), 6. + 12i);60  EVALF(3. / (2. + 4i), .3 - 0.6i);61}62 63// _Complex int + int64void d() {65  EVAL((2 + 4i) + 3, 5 + 4i);66  EVAL((2 + 4i) - 3, -1 + 4i);67  EVAL((2 + 4i) * 3, 6 + 12i);68  EVAL((2 + 4i) / 2, 1 + 2i);69 70  EVAL(3 + (2 + 4i), 5 + 4i);71  EVAL(3 - (2 + 4i), 1 - 4i);72  EVAL(3 * (2 + 4i), 6 + 12i);73  EVAL(20 / (2 + 4i), 2 - 4i);74}75 76// _Complex float + int77void e() {78  EVALF((2.f + 4i) + 3, 5.f + 4i);79  EVALF((2.f + 4i) - 3, -1.f + 4i);80  EVALF((2.f + 4i) * 3, 6.f + 12i);81  EVALF((2.f + 4i) / 2, 1.f + 2i);82 83  EVALF(3 + (2.f + 4i), 5.f + 4i);84  EVALF(3 - (2.f + 4i), 1.f - 4i);85  EVALF(3 * (2.f + 4i), 6.f + 12i);86  EVALF(3 / (2.f + 4i), .3f - 0.6i);87 88  EVALF((2. + 4i) + 3, 5. + 4i);89  EVALF((2. + 4i) - 3, -1. + 4i);90  EVALF((2. + 4i) * 3, 6. + 12i);91  EVALF((2. + 4i) / 2, 1. + 2i);92 93  EVALF(3 + (2. + 4i), 5. + 4i);94  EVALF(3 - (2. + 4i), 1. - 4i);95  EVALF(3 * (2. + 4i), 6. + 12i);96  EVALF(3 / (2. + 4i), .3 - 0.6i);97}98 99// _Complex int + float100void f() {101  EVALF((2 + 4i) + 3.f, 5.f + 4i);102  EVALF((2 + 4i) - 3.f, -1.f + 4i);103  EVALF((2 + 4i) * 3.f, 6.f + 12i);104  EVALF((2 + 4i) / 2.f, 1.f + 2i);105 106  EVALF(3.f + (2 + 4i), 5.f + 4i);107  EVALF(3.f - (2 + 4i), 1.f - 4i);108  EVALF(3.f * (2 + 4i), 6.f + 12i);109  EVALF(3.f / (2 + 4i), .3f - 0.6i);110 111  EVALF((2 + 4i) + 3., 5. + 4i);112  EVALF((2 + 4i) - 3., -1. + 4i);113  EVALF((2 + 4i) * 3., 6. + 12i);114  EVALF((2 + 4i) / 2., 1. + 2i);115 116  EVALF(3. + (2 + 4i), 5. + 4i);117  EVALF(3. - (2 + 4i), 1. - 4i);118  EVALF(3. * (2 + 4i), 6. + 12i);119  EVALF(3. / (2 + 4i), .3 - 0.6i);120}121