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:
parent
5bbccd9250
commit
d3eb902f7f
4 changed files with 45 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
31
gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C
Normal file
31
gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue