144 lines
3.8 KiB
C++
144 lines
3.8 KiB
C++
|
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify -Wno-unused-value %s
|
||
|
// RUN: %clang_cc1 -verify=ref -Wno-unused-value %s
|
||
|
|
||
|
// expected-no-diagnostics
|
||
|
// ref-no-diagnostics
|
||
|
|
||
|
constexpr _Complex double z1 = {1.0, 2.0};
|
||
|
static_assert(__real(z1) == 1.0, "");
|
||
|
static_assert(__imag(z1) == 2.0, "");
|
||
|
|
||
|
constexpr double setter() {
|
||
|
_Complex float d = {1.0, 2.0};
|
||
|
|
||
|
__imag(d) = 4.0;
|
||
|
return __imag(d);
|
||
|
}
|
||
|
static_assert(setter() == 4, "");
|
||
|
|
||
|
constexpr _Complex double getter() {
|
||
|
return {1.0, 3.0};
|
||
|
}
|
||
|
constexpr _Complex double D = getter();
|
||
|
static_assert(__real(D) == 1.0, "");
|
||
|
static_assert(__imag(D) == 3.0, "");
|
||
|
|
||
|
|
||
|
constexpr _Complex int I1 = {1, 2};
|
||
|
static_assert(__real(I1) == 1, "");
|
||
|
static_assert(__imag(I1) == 2, "");
|
||
|
|
||
|
|
||
|
constexpr _Complex double D1 = {};
|
||
|
static_assert(__real(D1) == 0, "");
|
||
|
static_assert(__imag(D1) == 0, "");
|
||
|
|
||
|
constexpr _Complex int I2 = {};
|
||
|
static_assert(__real(I2) == 0, "");
|
||
|
static_assert(__imag(I2) == 0, "");
|
||
|
|
||
|
static_assert(__real(4.0) == 4.0, "");
|
||
|
static_assert(__real(12u) == 12u, "");
|
||
|
static_assert(__imag(4.0) == 0.0, "");
|
||
|
static_assert(__imag(13) == 0, "");
|
||
|
|
||
|
constexpr int ignoredCast() {
|
||
|
I2;
|
||
|
(int)I2;
|
||
|
(float)I2;
|
||
|
D1;
|
||
|
(int)D1;
|
||
|
(double)D1;
|
||
|
return 0;
|
||
|
}
|
||
|
static_assert(ignoredCast() == 0, "");
|
||
|
static_assert((int)I1 == 1, "");
|
||
|
static_assert((float)D == 1.0f, "");
|
||
|
|
||
|
static_assert(__real((_Complex unsigned)5) == 5);
|
||
|
static_assert(__imag((_Complex unsigned)5) == 0);
|
||
|
|
||
|
/// Standalone complex expressions.
|
||
|
static_assert(__real((_Complex float){1.0, 3.0}) == 1.0, "");
|
||
|
|
||
|
|
||
|
constexpr _Complex double D2 = {12};
|
||
|
static_assert(__real(D2) == 12, "");
|
||
|
static_assert(__imag(D2) == 0, "");
|
||
|
|
||
|
constexpr _Complex int I3 = {15};
|
||
|
static_assert(__real(I3) == 15, "");
|
||
|
static_assert(__imag(I3) == 0, "");
|
||
|
|
||
|
/// FIXME: This should work in the new interpreter as well.
|
||
|
// constexpr _Complex _BitInt(8) A = 0;// = {4};
|
||
|
|
||
|
namespace CastToBool {
|
||
|
constexpr _Complex int F = {0, 1};
|
||
|
static_assert(F, "");
|
||
|
constexpr _Complex int F2 = {1, 0};
|
||
|
static_assert(F2, "");
|
||
|
constexpr _Complex int F3 = {0, 0};
|
||
|
static_assert(!F3, "");
|
||
|
|
||
|
constexpr _Complex unsigned char F4 = {0, 1};
|
||
|
static_assert(F4, "");
|
||
|
constexpr _Complex unsigned char F5 = {1, 0};
|
||
|
static_assert(F5, "");
|
||
|
constexpr _Complex unsigned char F6 = {0, 0};
|
||
|
static_assert(!F6, "");
|
||
|
|
||
|
constexpr _Complex float F7 = {0, 1};
|
||
|
static_assert(F7, "");
|
||
|
constexpr _Complex float F8 = {1, 0};
|
||
|
static_assert(F8, "");
|
||
|
constexpr _Complex double F9 = {0, 0};
|
||
|
static_assert(!F9, "");
|
||
|
}
|
||
|
|
||
|
namespace BinOps {
|
||
|
namespace Add {
|
||
|
constexpr _Complex float A = { 13.0, 2.0 };
|
||
|
constexpr _Complex float B = { 2.0, 1.0 };
|
||
|
constexpr _Complex float C = A + B;
|
||
|
static_assert(__real(C) == 15.0, "");
|
||
|
static_assert(__imag(C) == 3.0, "");
|
||
|
|
||
|
constexpr _Complex float D = B + A;
|
||
|
static_assert(__real(D) == 15.0, "");
|
||
|
static_assert(__imag(D) == 3.0, "");
|
||
|
|
||
|
constexpr _Complex unsigned int I1 = { 5, 10 };
|
||
|
constexpr _Complex unsigned int I2 = { 40, 2 };
|
||
|
constexpr _Complex unsigned int I3 = I1 + I2;
|
||
|
static_assert(__real(I3) == 45, "");
|
||
|
static_assert(__imag(I3) == 12, "");
|
||
|
}
|
||
|
|
||
|
namespace Sub {
|
||
|
constexpr _Complex float A = { 13.0, 2.0 };
|
||
|
constexpr _Complex float B = { 2.0, 1.0 };
|
||
|
constexpr _Complex float C = A - B;
|
||
|
static_assert(__real(C) == 11.0, "");
|
||
|
static_assert(__imag(C) == 1.0, "");
|
||
|
|
||
|
constexpr _Complex float D = B - A;
|
||
|
static_assert(__real(D) == -11.0, "");
|
||
|
static_assert(__imag(D) == -1.0, "");
|
||
|
|
||
|
constexpr _Complex unsigned int I1 = { 5, 10 };
|
||
|
constexpr _Complex unsigned int I2 = { 40, 2 };
|
||
|
constexpr _Complex unsigned int I3 = I1 - I2;
|
||
|
static_assert(__real(I3) == -35, "");
|
||
|
static_assert(__imag(I3) == 8, "");
|
||
|
|
||
|
using Bobble = _Complex float;
|
||
|
constexpr _Complex float A_ = { 13.0, 2.0 };
|
||
|
constexpr Bobble B_ = { 2.0, 1.0 };
|
||
|
constexpr _Complex float D_ = A_ - B_;
|
||
|
static_assert(__real(D_) == 11.0, "");
|
||
|
static_assert(__imag(D_) == 1.0, "");
|
||
|
}
|
||
|
|
||
|
}
|