https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86769
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |jakub at gcc dot gnu.org CC| |jakub at gcc dot gnu.org --- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So, cp/semantics.cc has for this simplify_loop_decl_cond /* If *COND_P specifies a conditional with a declaration, transform the loop such that while (A x = 42) { } for (; A x = 42;) { } becomes while (true) { A x = 42; if (!x) break; } for (;;) { A x = 42; if (!x) break; } The statement list for BODY will be empty if the conditional did not declare anything. */ But, if it does this transformation, this PR means we need to arrange for the expression to be added to the body as well, but not in the C++ FE but during the genericization, because the continue label needs to go before the expression. So perhaps let simplify_loop_decl should set some flag on FOR_STMT if it does this transformation. I think we need to get the destructors in the body right for that case though, even when not using explicit {}s around the body.