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)

Reply via email to