https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78689
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- From looking at inh-ctor23.C and what GCC and clang++ produce, there are different cases: _ZN1VCI21WEi emitted in _ZN1VCI51WEi comdat, with _ZN1VCI11WEi alias to it, which has the extra argument, callers pass it to it and users use it. _ZN1XCI21WEi emitted in _ZN1XCI21WEi comdat, without _ZN1XCI11WEi alias, which has the argument only in GCC (bug?), e.g. as seen with -O0 saves 3 arguments to stack instead of 2: movq %rdi, -8(%rbp) movq %rsi, -16(%rbp) movl %edx, -20(%rbp) but callers actually provide 2: X::X (_2, _3); I bet we want that extra argument (those extra arguments) to be there for mangling, but then we should likely remove them both from DECL_ARGUMENTS and from TYPE_ARG_TYPES (in that case it means probably replace the whole METHOD_TYPE). Otherwise I think the middle-end must be confused (callers pass fewer args than the method really has), and at -O0 it also has to save arguments it doesn't have that contain garbage etc.