| // 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; |
| } |