Commit 725891a0 by Michael Matz Committed by Michael Matz

re PR middle-end/86575 (-Wimplicit-fallthrough affects code generation)

Fix PR middle-end/86575

	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.

From-SVN: r266148
parent e81d464c
2018-11-14 Michael Matz <matz@suse.de>
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.
2018-11-14 Richard Biener <rguenther@suse.de> 2018-11-14 Richard Biener <rguenther@suse.de>
PR middle-end/87985 PR middle-end/87985
...@@ -1963,10 +1963,12 @@ last_stmt_in_scope (gimple *stmt) ...@@ -1963,10 +1963,12 @@ last_stmt_in_scope (gimple *stmt)
static gimple * static gimple *
collect_fallthrough_labels (gimple_stmt_iterator *gsi_p, 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; gimple *prev = NULL;
*prevloc = UNKNOWN_LOCATION;
do do
{ {
if (gimple_code (gsi_stmt (*gsi_p)) == GIMPLE_BIND) if (gimple_code (gsi_stmt (*gsi_p)) == GIMPLE_BIND)
...@@ -2003,7 +2005,7 @@ collect_fallthrough_labels (gimple_stmt_iterator *gsi_p, ...@@ -2003,7 +2005,7 @@ collect_fallthrough_labels (gimple_stmt_iterator *gsi_p,
/* It might be a label without a location. Use the /* It might be a label without a location. Use the
location of the scope then. */ location of the scope then. */
if (!gimple_has_location (prev)) if (!gimple_has_location (prev))
gimple_set_location (prev, bind_loc); *prevloc = bind_loc;
} }
gsi_next (gsi_p); gsi_next (gsi_p);
continue; continue;
...@@ -2086,6 +2088,8 @@ collect_fallthrough_labels (gimple_stmt_iterator *gsi_p, ...@@ -2086,6 +2088,8 @@ collect_fallthrough_labels (gimple_stmt_iterator *gsi_p,
&& (gimple_code (gsi_stmt (*gsi_p)) != GIMPLE_LABEL && (gimple_code (gsi_stmt (*gsi_p)) != GIMPLE_LABEL
|| !gimple_has_location (gsi_stmt (*gsi_p)))); || !gimple_has_location (gsi_stmt (*gsi_p))));
if (prev && gimple_has_location (prev))
*prevloc = gimple_location (prev);
return prev; return prev;
} }
...@@ -2182,7 +2186,8 @@ warn_implicit_fallthrough_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, ...@@ -2182,7 +2186,8 @@ warn_implicit_fallthrough_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
/* Vector of labels that fall through. */ /* Vector of labels that fall through. */
auto_vec <struct label_entry> labels; 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. */ /* There might be no more statements. */
if (gsi_end_p (*gsi_p)) if (gsi_end_p (*gsi_p))
...@@ -2210,8 +2215,8 @@ warn_implicit_fallthrough_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, ...@@ -2210,8 +2215,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 /* Try to be clever and don't warn when the statement
can't actually fall through. */ can't actually fall through. */
&& gimple_stmt_may_fallthru (prev) && gimple_stmt_may_fallthru (prev)
&& gimple_has_location (prev)) && prevloc != UNKNOWN_LOCATION)
warned_p = warning_at (gimple_location (prev), warned_p = warning_at (prevloc,
OPT_Wimplicit_fallthrough_, OPT_Wimplicit_fallthrough_,
"this statement may fall through"); "this statement may fall through");
if (warned_p) if (warned_p)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment