https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99705
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The *.original dump diff before/after is @@ -32,11 +32,11 @@ } <D.2413>:; { - struct C * D.2390; + struct C * D.2390 = D.2378 + ((SAVE_EXPR <(sizetype) ((struct X *) this)->n> - (sizetype) D.2380) + 18446744073709551615); (if (D.2378 != 0B) { - (void) (D.2390 = D.2378 + ((SAVE_EXPR <(sizetype) ((struct X *) this)->n> - (sizetype) D.2380) + 18446744073709551615));, while (1) + struct C * D.2390 = D.2378 + ((SAVE_EXPR <(sizetype) ((struct X *) this)->n> - (sizetype) D.2380) + 18446744073709551615);, while (1) { if (D.2390 == D.2378) break;, (void) (D.2390 = D.2390 + 18446744073709551615);;, C<int>::~C (D.2390);; }; and I think the problem is that this in the latter comes from the wrong ctor - _ZN1XC4Ev rather than expected _ZN1XC2Ev.