https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78435
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |diagnostic Status|UNCONFIRMED |RESOLVED Component|middle-end |tree-optimization Resolution|--- |INVALID --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- (gdb) p debug_generic_expr (ref) work[98] <bb 26>: _40 = strlen (&work); _41 = (unsigned int) _40; _42 = _41 + 1; size_43 = (int) _42; if (size_43 > 99) goto <bb 27>; else goto <bb 35>; <bb 27>: size_65 = ASSERT_EXPR <size_43, size_43 > 99>; work[98] = 0; Before inlining (knowing buffersize == 99) we have <bb 18>: _10 = strlen (&work); _11 = (unsigned int) _10; _12 = _11 + 1; size_48 = (int) _12; if (size_48 > buffersize_49(D)) goto <bb 19>; else goto <bb 20>; <bb 19>: _13 = buffersize_49(D) + -1; work[_13] = 0; but 'work' is [0, 27]. So clearly the code is bogus (even if we warn on dead code).