https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94383
Bug ID: 94383 Summary: [8/9/10 Regression] class with empty base passed incorrectly with -std=c++17 Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: ABI Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- Target: aarch64-*-linux This code is miscompiled on aarch64 with -std=c++17, apparently due to the empty base class: struct base { }; struct pair : base { float first; float second; pair(float f, float s) : first(f), second(s) { } }; void f(pair); int main() { f({3.14, 666}); } It is wrong with any optimization level, but with -std=gnu++14 -O1 we get: main: stp x29, x30, [sp, -16]! mov x29, sp mov x0, 0 mov x1, 62915 movk x1, 0x4048, lsl 16 bfi x0, x1, 0, 32 mov x1, 32768 movk x1, 0x4426, lsl 16 bfi x0, x1, 32, 32 lsr w1, w0, 0 fmov d0, x0 ushr d1, d0, 32 fmov s0, w1 bl f(pair) mov w0, 0 ldp x29, x30, [sp], 16 ret With -std=gnu++17 -O1 we get: main: stp x29, x30, [sp, -16]! mov x29, sp mov x0, 0 mov x1, 62915 movk x1, 0x4048, lsl 16 bfi x0, x1, 0, 32 mov x1, 32768 movk x1, 0x4426, lsl 16 bfi x0, x1, 32, 32 bl f(pair) mov w0, 0 ldp x29, x30, [sp], 16 ret If the translation unit containing the called function is: struct base { }; struct pair : base { float first; float second; pair(float f, float s) : first(f), second(s) { } }; void f(pair lr) { __builtin_printf("%f %f\n", lr.first, lr.second); } and the caller is compiled with -std=gnu++14 and the callee is compiled with -std=gnu++17 then the callee prints garabage: -13874.335938 0.000000