@@ -31,6 +31,7 @@ version (StdDdoc)
31
31
alias ddoc_long = int ;
32
32
alias ddoc_ulong = uint ;
33
33
}
34
+ struct ddoc_complex (T) {};
34
35
}
35
36
36
37
/* **
@@ -86,6 +87,24 @@ version (StdDdoc)
86
87
* C++ compiler's `ptrdiff_t` type.
87
88
*/
88
89
alias cpp_ptrdiff_t = ptrdiff_t ;
90
+
91
+ /* **
92
+ * Used for a complex floating point type that corresponds in size and ABI to the associated
93
+ * C compiler's `_Complex float` type.
94
+ */
95
+ alias c_complex_float = ddoc_complex! float ;
96
+
97
+ /* **
98
+ * Used for a complex floating point type that corresponds in size and ABI to the associated
99
+ * C compiler's `_Complex double` type.
100
+ */
101
+ alias c_complex_double = ddoc_complex! double ;
102
+
103
+ /* **
104
+ * Used for a complex floating point type that corresponds in size and ABI to the associated
105
+ * C compiler's `_Complex long double` type.
106
+ */
107
+ alias c_complex_real = ddoc_complex! real ;
89
108
}
90
109
else
91
110
{
@@ -208,4 +227,28 @@ else
208
227
alias cpp_size_t = size_t ;
209
228
alias cpp_ptrdiff_t = ptrdiff_t ;
210
229
}
230
+
231
+ // ABI layout of native complex types.
232
+ private struct _Complex (T)
233
+ {
234
+ T re;
235
+ T im;
236
+ }
237
+
238
+ version (Posix )
239
+ {
240
+ align (float .alignof) enum __c_complex_float : _Complex! float ;
241
+ align (double .alignof) enum __c_complex_double : _Complex! double ;
242
+ align (real .alignof) enum __c_complex_real : _Complex! real ;
243
+ }
244
+ else
245
+ {
246
+ align (float .sizeof * 2 ) enum __c_complex_float : _Complex! float ;
247
+ align (double .sizeof * 2 ) enum __c_complex_double : _Complex! double ;
248
+ align (real .alignof) enum __c_complex_real : _Complex! real ;
249
+ }
250
+
251
+ alias c_complex_float = __c_complex_float;
252
+ alias c_complex_double = __c_complex_double;
253
+ alias c_complex_real = __c_complex_real;
211
254
}
0 commit comments