]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix spurious fallthrough warning on break
authorSiddhesh Poyarekar <siddhesh@sourceware.org>
Tue, 20 Feb 2018 11:11:31 +0000 (11:11 +0000)
committerSiddhesh Poyarekar <siddhesh@gcc.gnu.org>
Tue, 20 Feb 2018 11:11:31 +0000 (11:11 +0000)
The C++ frontend generates a break that results in the fallthrough
warning misfiring in nested switch blocks where cases in the inner
switch block return, rendering the break pointless.  The fallthrough
detection in finish_break_stmt does not work either because the
condition is encoded as an IF_STMT and not a COND_EXPR.

Fix this by adding a condition for IF_STMT in the
langhooks.block_may_fallthru for C++.  Fix tested on x86_64.

gcc/cp
        * cp-objcp-common.c (cxx_block_may_fallthru): Add case for
        IF_STMT.

gcc/testsuite
        * g++.dg/nested-switch.C: New test case.

From-SVN: r257843

gcc/cp/ChangeLog
gcc/cp/cp-objcp-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C [new file with mode: 0644]

index f2bcce9784e1d5a79be67fc8ed02f98e4373d461..dd408e0bf68709b0e314e75fc41a88786cbaeab7 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-20  Siddhesh Poyarekar  <siddhesh@sourceware.org>
+
+       * cp-objcp-common.c (cxx_block_may_fallthru): Add case for
+       IF_STMT.
+
 2018-02-20  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/84446
index a45dda4d012a04b13ee269d93f32bb4f1bc494a2..5289a89e4869f6473e587c480a1f0aa6e97483fa 100644 (file)
@@ -349,6 +349,11 @@ cxx_block_may_fallthru (const_tree stmt)
     case THROW_EXPR:
       return false;
 
+    case IF_STMT:
+      if (block_may_fallthru (THEN_CLAUSE (stmt)))
+       return true;
+      return block_may_fallthru (ELSE_CLAUSE (stmt));
+
     case SWITCH_STMT:
       return (!SWITCH_STMT_ALL_CASES_P (stmt)
              || !SWITCH_STMT_NO_BREAK_P (stmt)
index 476374a2333e03f9d478661d0c7d2e1a6186094b..cfae982f6942607b30d2fe5f7009ebed74428ddd 100644 (file)
@@ -1,3 +1,7 @@
+2018-02-20  Siddhesh Poyarekar  <siddhesh@sourceware.org>
+
+       * g++.dg/warn/Wimplicit-fallthrough-3.C: New test case.
+
 2018-02-20  Martin Liska  <mliska@suse.cz>
 
        PR c/84310
diff --git a/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C b/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C
new file mode 100644 (file)
index 0000000..2f06817
--- /dev/null
@@ -0,0 +1,31 @@
+// Verify that there are no spurious warnings in nested switch statements due
+// to the unnecessary break in the inner switch block.
+// { dg-do compile }
+// { dg-options "-Wimplicit-fallthrough" } */
+
+int
+foo (int c1, int c2, int c3)
+{
+  switch (c2)
+    {
+    case 0:   
+      switch (c3)      // { dg-bogus "may fall through" }
+       {
+       case 0:
+         if (c1)
+           return 1;
+         else
+           return 2;
+         break;
+
+       default:
+         return 3;
+       }
+
+    case 1: 
+      return 4;
+    default:
+      return 5;
+      break;
+    }
+}