[clang] [llvm] [LLVMABI][AARCH64] Handle condtions for ignoring empty types (PR #224476)

Peter Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 18 06:18:50 PDT 2026


================
@@ -794,4 +794,78 @@ TEST_F(AArch64TargetInfoTest, ClassifyArgumentOveralignedHFAAlign) {
   }
 }
 
+// Empty records and zero-size types are ignored as returns under all AArch64
----------------
smithp35 wrote:

I know this is existing clang behaviour but it looks wrong for C++ by the definition in:

https://github.com/ARM-software/abi-aa/blob/main/cppabi64/cppabi64.rst#41summary-of-differences-from-and-additions-to-the-generic-c-abi
> For the purposes of parameter passing in [[AAPCS64](https://github.com/ARM-software/abi-aa/releases)], a parameter whose type is an empty class shall be treated as if its type were an aggregate with a single member of type unsigned byte.

and https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#69result-return
> If the type, T, of the result of a function is such that
>
> void func(T arg)
> would require that arg be passed as a value in a register (or set of registers) according to the rules in [Parameter passing](https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#parameter-passing), then the result is returned in the same registers as would be used for such an argument.

My interpretation there is that if an Empty type is treated as if it was an aggregate of a single member of type unsigned byte, then it would be returned in w0.

>From what I can tell GCC does return a value for Empty types. For example for
```
struct Empty {};
Empty ret_empty() { return {}; }
```
I get from GCC
```
        .global _Z9ret_emptyv
        .type   _Z9ret_emptyv, %function
_Z9ret_emptyv:
.LFB0:
        .cfi_startproc
        mov     w0, 0
        ret
        .cfi_endproc
.LFE0:
        .size   _Z9ret_emptyv, .-_Z9ret_emptyv
```
but clang has just got the `ret`.

I think you've got no choice but follow existing clang behaviour here though.

I'll see if I can chase up internally if this has come up before.

https://github.com/llvm/llvm-project/pull/224476


More information about the cfe-commits mailing list