re PR c++/20681 (wrong "control reaches" warning with switches)

PR c++/20681
	* semantics.c (finish_break_stmt): Avoid adding an unreachable
	BREAK_STMT.

From-SVN: r183161
This commit is contained in:
Jason Merrill 2012-01-13 15:06:16 -05:00 committed by Jason Merrill
parent 07dee0c66a
commit 04771457dc
4 changed files with 34 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2012-01-13 Jason Merrill <jason@redhat.com>
PR c++/20681
* semantics.c (finish_break_stmt): Avoid adding an unreachable
BREAK_STMT.
PR c++/51813
* decl2.c (constrain_visibility): Clear DECL_VISIBILITY_SPECIFIED
when reducing the visibility.

View File

@ -995,6 +995,15 @@ finish_range_for_decl (tree range_for_stmt, tree decl, tree expr)
tree
finish_break_stmt (void)
{
/* In switch statements break is sometimes stylistically used after
a return statement. This can lead to spurious warnings about
control reaching the end of a non-void function when it is
inlined. Note that we are calling block_may_fallthru with
language specific tree nodes; this works because
block_may_fallthru returns true when given something it does not
understand. */
if (!block_may_fallthru (cur_stmt_list))
return void_zero_node;
return add_stmt (build_stmt (input_location, BREAK_STMT));
}

View File

@ -1,3 +1,8 @@
2012-01-13 Jason Merrill <jason@redhat.com>
PR c++/20681
* g++.dg/warn/Wreturn-type-7.C: New.
2012-01-13 Georg-Johann Lay <avr@gjlay.de>
* gcc.c-torture/execute/20120111-1.c: Fix wrong int = int32_t

View File

@ -0,0 +1,16 @@
// PR c++/20681
// { dg-options -Wreturn-type }
struct a{~a();a();};
int GetMetaCombination (int a2)
{
a bi;
switch (a2)
{
case 1:
return 18;
break;//removing this works around the warning
default:
return 0;
}
}