On Fri, May 10, 2019 at 04:26:47PM -0400, Jason Merrill wrote: > That is strange. That seems to go back to > > Surely we should only set the incr location if it doesn't already have one, > as would have been the case before that patch.
So, like this then? Bootstrapped/regtested again on x86_64-linux and i686-linux: 2019-05-11 Jakub Jelinek <ja...@redhat.com> PR debug/90197 * cp-gimplify.c (genericize_cp_loop): Emit a DEBUG_BEGIN_STMT before the condition (or if missing or constant non-zero at the end of the loop. Emit a DEBUG_BEGIN_STMT before the increment expression if any. Don't call protected_set_expr_location on incr if it already has a location. --- gcc/cp/cp-gimplify.c.jj 2019-05-10 23:20:35.812735806 +0200 +++ gcc/cp/cp-gimplify.c 2019-05-10 23:23:20.712991042 +0200 @@ -241,8 +241,10 @@ genericize_cp_loop (tree *stmt_p, locati tree blab, clab; tree exit = NULL; tree stmt_list = NULL; + tree debug_begin = NULL; - protected_set_expr_location (incr, start_locus); + if (EXPR_LOCATION (incr) == UNKNOWN_LOCATION) + protected_set_expr_location (incr, start_locus); cp_walk_tree (&cond, cp_genericize_r, data, NULL); cp_walk_tree (&incr, cp_genericize_r, data, NULL); @@ -253,6 +255,13 @@ genericize_cp_loop (tree *stmt_p, locati cp_walk_tree (&body, cp_genericize_r, data, NULL); *walk_subtrees = 0; + if (MAY_HAVE_DEBUG_MARKER_STMTS + && (!cond || !integer_zerop (cond))) + { + debug_begin = build0 (DEBUG_BEGIN_STMT, void_type_node); + SET_EXPR_LOCATION (debug_begin, cp_expr_loc_or_loc (cond, start_locus)); + } + if (cond && TREE_CODE (cond) != INTEGER_CST) { /* If COND is constant, don't bother building an exit. If it's false, @@ -265,10 +274,24 @@ genericize_cp_loop (tree *stmt_p, locati } if (exit && cond_is_first) - append_to_statement_list (exit, &stmt_list); + { + append_to_statement_list (debug_begin, &stmt_list); + debug_begin = NULL_TREE; + append_to_statement_list (exit, &stmt_list); + } append_to_statement_list (body, &stmt_list); finish_bc_block (&stmt_list, bc_continue, clab); - append_to_statement_list (incr, &stmt_list); + if (incr) + { + if (MAY_HAVE_DEBUG_MARKER_STMTS) + { + tree d = build0 (DEBUG_BEGIN_STMT, void_type_node); + SET_EXPR_LOCATION (d, cp_expr_loc_or_loc (incr, start_locus)); + append_to_statement_list (d, &stmt_list); + } + append_to_statement_list (incr, &stmt_list); + } + append_to_statement_list (debug_begin, &stmt_list); if (exit && !cond_is_first) append_to_statement_list (exit, &stmt_list); Jakub