https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126725

            Bug ID: 126725
           Summary: class with a trivial_abi member not passed via
                    register
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ivan.lazaric.gcc at gmail dot com
  Target Milestone: ---

```cpp
struct [[clang::trivial_abi]] A {
    long x = 1337;
    ~A() {}
};

struct B { A a; };

struct C : A {};

void consume(auto);

void use_A() { consume(A{}); }
void use_B() { consume(B{}); }
void use_C() { consume(C{}); }
```

Flags: "-std=c++26 -O3"

asm generated:
```
"use_A()":
        mov     edi, 1337
        jmp     "void consume<A>(A)"
"use_B()":
        sub     rsp, 24
        mov     QWORD PTR [rsp+8], 1337
        lea     rdi, [rsp+8]
        call    "void consume<B>(B)"
        add     rsp, 24
        ret
"use_C()":
        sub     rsp, 24
        mov     QWORD PTR [rsp+8], 1337
        lea     rdi, [rsp+8]
        call    "void consume<C>(C)"
        add     rsp, 24
        ret
```

B and C were passed on stack, not through register
clang passes all 3 through register:
```
use_A():
        mov     edi, 1337
        jmp     void consume<A>(A)@PLT

use_B():
        mov     edi, 1337
        jmp     void consume<B>(B)@PLT

use_C():
        mov     edi, 1337
        jmp     void consume<C>(C)@PLT
```

https://godbolt.org/z/dsjjE3qbs
  • [Bug c++/126725] New: class... ivan.lazaric.gcc at gmail dot com via Gcc-bugs

Reply via email to