[hjl@gnu-6 pr60336d]$ cat x.i struct dummy0 { int i; }; struct dummy { struct dummy0 d[0]; }; extern void fun(struct dummy, int); void foo (void) { struct dummy d; fun(d, 1); } [hjl@gnu-6 pr60336d]$ g++ -S -Wabi=9 x.i [hjl@gnu-6 pr60336d]$ cat x.s .file "x.i" .text .globl _Z3foov .type _Z3foov, @function _Z3foov: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $1, %edi call _Z3fun5dummyi nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size _Z3foov, .-_Z3foov .ident "GCC: (GNU) 5.3.1 20160406 (Red Hat 5.3.1-6)" .section .note.GNU-stack,"",@progbits [hjl@gnu-6 pr60336d]$ /export/build/gnu/gcc-x32/build-x86_64-linux/gcc/xg++ -B/export/build/gnu/gcc-x32/build-x86_64-linux/gcc/ -S -Wabi=9 x.i x.i: In function ‘void foo()’: x.i:8:12: warning: call to ‘fun’: empty class ‘dummy’ parameter passing ABI changes in -fabi-version=10 (GCC 6) [-Wabi] fun(d, 1); ^ [hjl@gnu-6 pr60336d]$ cat x.s .file "x.i" .text .globl _Z3foov .type _Z3foov, @function _Z3foov: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $1, %edi call _Z3fun5dummyi nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size _Z3foov, .-_Z3foov .ident "GCC: (GNU) 6.0.0 20160413 (experimental)" .section .note.GNU-stack,"",@progbits [hjl@gnu-6 pr60336d]$ The warning is incorrect since there is no change in zero-sized array passing.
Created attachment 38272 [details] fix
Fixed by reverting the ABI change.