From cc284d9cf738f0efd4dedd42476da8372d6a38d6 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Thu, 28 Feb 2019 22:29:42 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/gimplify.c | 14 ++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ .../c-c++-common/Wimplicit-fallthrough-37.c | 13 +++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/Wimplicit-fallthrough-37.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d91746c5d0..3ee63704fd5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2019-02-28 Marek Polacek + + 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. + 2019-02-28 Jan Hubicka PR lto/88585 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 7e37e500d81..983635ba21f 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(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 % not preceding " + "a case label or default label"); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8a36b1f802e..423591d3a8d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-02-28 Marek Polacek + + PR c++/87068 - missing diagnostic with fallthrough statement. + * c-c++-common/Wimplicit-fallthrough-37.c: New test. + 2019-02-28 Thomas Schwinge Cesar Philippidis diff --git a/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-37.c b/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-37.c new file mode 100644 index 00000000000..644003af47d --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-37.c @@ -0,0 +1,13 @@ +/* PR c++/87068 */ +/* { dg-do compile } */ + +void +f (int n) +{ + switch (n) + { + case 4: + ++n; + __attribute__((fallthrough)); /* { dg-warning "not preceding" } */ + } +} -- 2.30.2