https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79929
--- Comment #3 from Harald Anlauf <anlauf at gmx dot de> --- I've slightly reduced the example to the following: % cat gfcbug138c.f90 subroutine gfcbug138 (yerrmsg) character(kind=1,len=*) :: yerrmsg yerrmsg = 1_"bug: " // yerrmsg end subroutine gfcbug138 The dump tree now reads: gfcbug138 (character(kind=1)[1:_yerrmsg] & restrict yerrmsg, integer(kind=4) _yerrmsg) { bitsizetype D.3423; sizetype D.3424; D.3423 = (bitsizetype) (sizetype) NON_LVALUE_EXPR <_yerrmsg> * 8; D.3424 = (sizetype) NON_LVALUE_EXPR <_yerrmsg>; { character(kind=1)[1:] * pstr.0; void * restrict D.3419; integer(kind=4) D.3420; integer(kind=4) D.3421; integer(kind=4) D.3422; D.3419 = (void * restrict) __builtin_malloc (MAX_EXPR <(character(kind=4)) (_yerrmsg + 5), 1>); pstr.0 = (character(kind=1)[1:] *) D.3419; _gfortran_concat_string (_yerrmsg + 5, pstr.0, 5, &"bug: "[1]{lb: 1 sz: 1}, _yerrmsg, yerrmsg); D.3420 = _yerrmsg + 5; D.3421 = _yerrmsg + 5; D.3422 = _yerrmsg; if (D.3422 != 0) { __builtin_memmove ((void *) yerrmsg, (void *) pstr.0, MIN_EXPR <(character(kind=4)) D.3422, (character(kind=4)) D.3421>); if ((character(kind=4)) D.3421 < (character(kind=4)) D.3422) { __builtin_memset ((void *) yerrmsg + (sizetype) D.3421, 32, (character(kind=4)) D.3422 - (character(kind=4)) D.3421); } } __builtin_free ((void *) pstr.0); } } - Why are there still occurrences of character(kind=4)? Shouldn't there be always character(kind=1)? - The optimizer gets confused by a potential overflow of the length of the concatenated string (_yerrmsg + 5), which is the only way the memset can be invoked, with a length of -5, which is less than 0 (assuming ordinary wrapping integer arithmetic)