https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84502
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ABI Status|UNCONFIRMED |NEW Last reconfirmed| |2018-02-21 Known to work| |7.3.0 Summary|Argument corruption when |[8 Regression] Argument |passing empty templated |corruption when passing |struct |empty templated struct Ever confirmed|0 |1 Known to fail| |8.0.1 --- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- This is caused by -fabi-version=12 (which is the default for GCC 8). You can get the old handling of empty structs with -fabi-version=11 The bug only seems to happen when the empty struct is a class template. Reduced, this fails at -O0 but not any other optimization level, or with -fabi-version=11: template<typename T> struct EmptyTemplatedStruct { }; using X = EmptyTemplatedStruct<int>; void func(X, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) { if (a1 != 0) __builtin_abort(); if (a2 != 1) __builtin_abort(); if (a3 != 2) __builtin_abort(); if (a4 != 3) __builtin_abort(); if (a5 != 4) __builtin_abort(); if (a6 != 5) __builtin_abort(); if (a7 != 6) __builtin_abort(); if (a8 != 7) __builtin_abort(); } int main() { func(X{}, 0, 1, 2, 3, 4, 5, 6, 7); }