diff options
author | Marek Polacek <polacek@redhat.com> | 2019-02-28 22:29:42 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2019-02-28 22:29:42 +0000 |
commit | cc284d9cf738f0efd4dedd42476da8372d6a38d6 (patch) | |
tree | d36b846330e81bbc43a80c1d99385e483956dabf /gcc/gimplify.c | |
parent | 80d6ca01843d2119c913e3adf27d20204846072f (diff) | |
download | gcc-cc284d9cf738f0efd4dedd42476da8372d6a38d6.zip gcc-cc284d9cf738f0efd4dedd42476da8372d6a38d6.tar.gz gcc-cc284d9cf738f0efd4dedd42476da8372d6a38d6.tar.bz2 |
PR c++/87068 - missing diagnostic with fallthrough statement.
* gimplify.c (expand_FALLTHROUGH_r): If IFN_FALLTHROUGH was found
at the end of a seq, save its location to walk_stmt_info.
(expand_FALLTHROUGH): Warn if IFN_FALLTHROUGH is at the end of
a switch.
* c-c++-common/Wimplicit-fallthrough-37.c: New test.
From-SVN: r269288
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 7e37e50..983635b 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -2263,7 +2263,7 @@ maybe_warn_implicit_fallthrough (gimple_seq seq) static tree expand_FALLTHROUGH_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, - struct walk_stmt_info *) + struct walk_stmt_info *wi) { gimple *stmt = gsi_stmt (*gsi_p); @@ -2283,7 +2283,10 @@ expand_FALLTHROUGH_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, { gsi_remove (gsi_p, true); if (gsi_end_p (*gsi_p)) - return integer_zero_node; + { + *static_cast<location_t *>(wi->info) = gimple_location (stmt); + return integer_zero_node; + } bool found = false; location_t loc = gimple_location (stmt); @@ -2347,8 +2350,15 @@ static void expand_FALLTHROUGH (gimple_seq *seq_p) { struct walk_stmt_info wi; + location_t loc; memset (&wi, 0, sizeof (wi)); + wi.info = (void *) &loc; walk_gimple_seq_mod (seq_p, expand_FALLTHROUGH_r, NULL, &wi); + if (wi.callback_result == integer_zero_node) + /* We've found [[fallthrough]]; at the end of a switch, which the C++ + standard says is ill-formed; see [dcl.attr.fallthrough]. */ + warning_at (loc, 0, "attribute %<fallthrough%> not preceding " + "a case label or default label"); } |