https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94930
--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> --- AFAIK -ftrapv doesn't work very well and is kind of abandoned, in favor of -fsanitize=signed-integer-overflow (possibly with -fsanitize-undefined-trap-on-error), which does generate the code you expect.