https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86216
--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> --- The C FE does /* Arrange for the SAVE_EXPR on the inside of the MINUS_EXPR, which allows the -1 to get folded with the +1 that happens when building TYPE_SIZE. */ if (size_varies) size = save_expr (size); while the C++ FE relies on variable_size() after building the whole expression. Eliding the above optimization makes the IL more similar but it still doesn't break.