Hi, our warning code sometimes adds locations to statement which didn't have them before, which can in turn lead to code changes (here only label numbers change). It seems better to not do that from warning code, and here it's easy to do: just return the location we want to use for warnings, don't change it in the statement itself.
Regstrapped on x86-64, okay for trunk? Ciao, Michael. PR middle-end/86575 * gimplify.c (collect_fallthrough_labels): Add new argument, return location via that, don't modify statements. (warn_implicit_fallthrough_r): Adjust call, don't use statement location directly. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 509fc2f3f5be..22dff0e546c9 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1938,10 +1938,12 @@ last_stmt_in_scope (gimple *stmt) static gimple * collect_fallthrough_labels (gimple_stmt_iterator *gsi_p, - auto_vec <struct label_entry> *labels) + auto_vec <struct label_entry> *labels, + location_t *prevloc) { gimple *prev = NULL; + *prevloc = UNKNOWN_LOCATION; do { if (gimple_code (gsi_stmt (*gsi_p)) == GIMPLE_BIND) @@ -1978,7 +1980,7 @@ collect_fallthrough_labels (gimple_stmt_iterator *gsi_p, /* It might be a label without a location. Use the location of the scope then. */ if (!gimple_has_location (prev)) - gimple_set_location (prev, bind_loc); + *prevloc = bind_loc; } gsi_next (gsi_p); continue; @@ -2061,6 +2063,8 @@ collect_fallthrough_labels (gimple_stmt_iterator *gsi_p, && (gimple_code (gsi_stmt (*gsi_p)) != GIMPLE_LABEL || !gimple_has_location (gsi_stmt (*gsi_p)))); + if (prev && gimple_has_location (prev)) + *prevloc = gimple_location (prev); return prev; } @@ -2157,7 +2161,8 @@ warn_implicit_fallthrough_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, /* Vector of labels that fall through. */ auto_vec <struct label_entry> labels; - gimple *prev = collect_fallthrough_labels (gsi_p, &labels); + location_t prevloc; + gimple *prev = collect_fallthrough_labels (gsi_p, &labels, &prevloc); /* There might be no more statements. */ if (gsi_end_p (*gsi_p)) @@ -2185,8 +2190,8 @@ warn_implicit_fallthrough_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, /* Try to be clever and don't warn when the statement can't actually fall through. */ && gimple_stmt_may_fallthru (prev) - && gimple_has_location (prev)) - warned_p = warning_at (gimple_location (prev), + && prevloc != UNKNOWN_LOCATION) + warned_p = warning_at (prevloc, OPT_Wimplicit_fallthrough_, "this statement may fall through"); if (warned_p)