blob: 09aea83ac11b85fa327ae80534cea5cb5607dcb6 [file] [log] [blame]
// https://issues.dlang.org/show_bug.cgi?id=21515
// DISABLED: win32 win64
// ABI layout of native complex
struct _Complex(T) { T re; T im; }
// Special enum definitions.
version (Posix)
{
align(float.alignof) enum __c_complex_float : _Complex!float;
align(double.alignof) enum __c_complex_double : _Complex!double;
align(real.alignof) enum __c_complex_real : _Complex!real;
}
else
{
align(float.sizeof * 2) enum __c_complex_float : _Complex!float;
align(double.sizeof * 2) enum __c_complex_double : _Complex!double;
align(real.alignof) enum __c_complex_real : _Complex!real;
}
alias complex_float = __c_complex_float;
alias complex_double = __c_complex_double;
alias complex_real = __c_complex_real;
extern(D) complex_float dcomplexf() { return typeof(return)(2, 1); }
extern(D) complex_double dcomplex() { return typeof(return)(2, 1); }
extern(D) complex_real dcomplexl() { return typeof(return)(2, 1); }
extern(D) void dcomplexf(complex_float c) { assert(c.re == 2 && c.im == 1); }
extern(D) void dcomplex(complex_double c) { assert(c.re == 2 && c.im == 1); }
extern(D) void dcomplexl(complex_real c) { assert(c.re == 2 && c.im == 1); }
extern(C) complex_float ccomplexf() { return typeof(return)(2, 1); }
extern(C) complex_double ccomplex() { return typeof(return)(2, 1); }
extern(C) complex_real ccomplexl() { return typeof(return)(2, 1); }
extern(C) void ccomplexf2(complex_float c) { assert(c.re == 2 && c.im == 1); }
extern(C) void ccomplex2(complex_double c) { assert(c.re == 2 && c.im == 1); }
extern(C) void ccomplexl2(complex_real c) { assert(c.re == 2 && c.im == 1); }
extern(C++) complex_float cpcomplexf() { return typeof(return)(2, 1); }
extern(C++) complex_double cpcomplex() { return typeof(return)(2, 1); }
extern(C++) complex_real cpcomplexl() { return typeof(return)(2, 1); }
extern(C++) void cpcomplexf(complex_float c) { assert(c.re == 2 && c.im == 1); }
extern(C++) void cpcomplex(complex_double c) { assert(c.re == 2 && c.im == 1); }
extern(C++) void cpcomplexl(complex_real c) { assert(c.re == 2 && c.im == 1); }
int main()
{
auto a1 = dcomplexf();
auto b1 = dcomplex();
auto c1 = dcomplexl();
assert(a1.re == 2 && a1.im == 1);
assert(b1.re == 2 && b1.im == 1);
assert(c1.re == 2 && c1.im == 1);
dcomplexf(a1);
dcomplex(b1);
dcomplexl(c1);
auto a2 = ccomplexf();
auto b2 = ccomplex();
auto c2 = ccomplexl();
assert(a2.re == 2 && a2.im == 1);
assert(b2.re == 2 && b2.im == 1);
assert(c2.re == 2 && c2.im == 1);
ccomplexf2(a2);
ccomplex2(b2);
ccomplexl2(c2);
auto a3 = cpcomplexf();
auto b3 = cpcomplex();
auto c3 = cpcomplexl();
assert(a3.re == 2 && a3.im == 1);
assert(b3.re == 2 && b3.im == 1);
assert(c3.re == 2 && c3.im == 1);
cpcomplexf(a3);
cpcomplex(b3);
cpcomplexl(c3);
return 0;
}