https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114421
--- Comment #2 from Earle F. Philhower, III <earlephilhower at yahoo dot com> --- Thanks very much for the fast explanation. For reference of others who might hit this, I see references to C11 6.8.5 pp 6 online (but of course it's an ISO document so not freely available). "An iteration statement whose controlling expression is not a constant expression, that performs no input/output operations, does not access volatile objects, and performs no synchronization or atomic operations in its body, controlling expression, or (in the case of a for statement) its expression-3, may be assumed by the implementation to terminate."