https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90561
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- There's a temporary created by the FE that is not in the BIND_EXPR vars list. Or rather, it is in the wrong BIND or the assign is in the wrong place: p () { ... { character(kind=1)[0:][1:.z] * restrict D.3931; integer(kind=8) D.3932; integer(kind=8) D.3933; integer(kind=8) D.3934; integer(kind=8) D.3935; struct array01_unknown atmp.2; logical(kind=4) D.3943; integer(kind=8) D.3944; void * restrict D.3945; void * restrict D.3946; integer(kind=8) D.3947; D.3949 = .z; <<<--------- ... D.3947 = NON_LVALUE_EXPR <D.3933>; { integer(kind=8) S.3; S.3 = 0; while (1) { if (S.3 > D.3935) goto L.4; { integer(kind=8) D.3949; <<<-------- integer(kind=8) D.3950; integer(kind=8) D.3951; D.3950 = D.3949; <<<---------- D.3951 = D.3949;