@@ -270,14 +270,27 @@ hierarchy flattened, including any array fields. That is, `struct { struct
270
270
{ float f[1]; } a[2]; }` and `struct { float f0; float f1; }` are
271
271
treated the same. Fields containing empty structs or unions are ignored while
272
272
flattening, even in {Cpp}, unless they have nontrivial copy constructors or
273
- destructors. Fields containing zero-length bit-fields are ignored while
274
- flattening. Attributes such as `aligned` or `packed` do not interfere with a
275
- struct's eligibility for being passed in registers according to the rules
276
- below, i.e. `struct { int i; double d; }` and `+struct
273
+ destructors. Fields containing zero-length bit-fields or zero-length arrays are
274
+ ignored while flattening. Attributes such as `aligned` or `packed` do not
275
+ interfere with a struct's eligibility for being passed in registers according
276
+ to the rules below, i.e. `struct { int i; double d; }` and `+struct
277
277
__attribute__((__packed__)) { int i; double d }+` are treated the same, as are
278
278
`struct { float f; float g; }` and `+struct { float f; float g __attribute__
279
279
((aligned (8))); }+`.
280
280
281
+ NOTE: One exceptional case for the flattening rule is an array of empty
282
+ structs or unions; C treats it as an empty field, but {Cpp}
283
+ treats it as a non-empty field since {Cpp} defines the size of an empty struct
284
+ or union as 1. i.e. for `struct { struct {} e[1]; float f; }` as the first
285
+ argument, C will treat it like `struct { float f; }` and pass `f` in `fa0` as
286
+ described below, whereas {Cpp} will pass the pass the entire aggregate in `a0`
287
+ (XLEN = 64) or `a0` and `a1` (XLEN = 32), as described in the integer calling
288
+ convention.
289
+ Zero-length arrays of empty structs or union will be
290
+ ignored for both C and {Cpp}. i.e. For `struct { struct {} e[0]; float f; };`,
291
+ as the first argument, C and {Cpp} will treat it like `struct { float f; }`
292
+ and pass `f` in `fa0` as described below.
293
+
281
294
A real floating-point argument is passed in a floating-point argument
282
295
register if it is no more than ABI_FLEN bits wide and at least one floating-point
283
296
argument register is available. Otherwise, it is passed according to the
0 commit comments