c++: Fix spurious fallthrough warning on break

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
This commit is contained in:
Siddhesh Poyarekar 2018-02-20 11:11:31 +00:00 committed by Siddhesh Poyarekar
parent 5bbccd9250
commit d3eb902f7f
4 changed files with 45 additions and 0 deletions

View 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

View 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)

View 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

View file

@ -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;
}
}