On Wed, Nov 14, 2018 at 3:51 PM Michael Matz <m...@suse.de> wrote: > > 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?
OK. Richard. > > 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)