diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-11-23 17:04:03 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-11-23 17:04:03 +0100 |
commit | 88cd0e88e36515f01b6f1e398358dc11cc06c389 (patch) | |
tree | 756c94d3f1786802105c930a7ed81bf4e39c9a8d /gcc/cp | |
parent | 340ef734b8072d2b58f946bb69170f2e535813d7 (diff) | |
download | gcc-88cd0e88e36515f01b6f1e398358dc11cc06c389.zip gcc-88cd0e88e36515f01b6f1e398358dc11cc06c389.tar.gz gcc-88cd0e88e36515f01b6f1e398358dc11cc06c389.tar.bz2 |
re PR c++/54046 (wrong control reaches end of non-void function for switch case with throw and default)
PR c++/54046
* Makefile.in (gimple-low.o): Depend on langhooks.h.
* gimple-low.c: Include langhooks.c.
(block_may_fallthru): Handle TARGET_EXPR and ERROR_MARK,
by default call lang_hooks.block_may_fallthru.
* langhooks.h (struct lang_hooks): Add block_may_fallthru
langhook.
* langhooks-def.h (LANG_HOOKS_BLOCK_MAY_FALLTHRU): Define.
(LANG_HOOKS_INITIALIZER): Use it.
* cp-objcp-common.h (LANG_HOOKS_BLOCK_MAY_FALLTHRU): Redefine.
* cp-objcp-common.c (cxx_block_may_fallthru): New function.
* cp-tree.h (cxx_block_may_fallthru): New prototype.
* g++.dg/warn/Wreturn-type-8.C: New test.
From-SVN: r193762
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-objcp-common.c | 19 | ||||
-rw-r--r-- | gcc/cp/cp-objcp-common.h | 2 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 |
4 files changed, 29 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 47734c5..95fb0bf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-11-23 Jakub Jelinek <jakub@redhat.com> + + PR c++/54046 + * cp-objcp-common.h (LANG_HOOKS_BLOCK_MAY_FALLTHRU): Redefine. + * cp-objcp-common.c (cxx_block_may_fallthru): New function. + * cp-tree.h (cxx_block_may_fallthru): New prototype. + 2012-11-23 Markus Trippelsdorf <markus@trippelsdorf.de> PR c++/55418 diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index 9b7d361..20dd339 100644 --- a/gcc/cp/cp-objcp-common.c +++ b/gcc/cp/cp-objcp-common.c @@ -227,6 +227,25 @@ init_shadowed_var_for_decl (void) tree_decl_map_eq, 0); } +/* Return true if stmt can fall thru. Used by block_may_fallthru + default case. */ + +bool +cxx_block_may_fallthru (const_tree stmt) +{ + switch (TREE_CODE (stmt)) + { + case EXPR_STMT: + return block_may_fallthru (EXPR_STMT_EXPR (stmt)); + + case THROW_EXPR: + return false; + + default: + return true; + } +} + void cp_common_init_ts (void) { diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h index 06cc796..4cfc59c 100644 --- a/gcc/cp/cp-objcp-common.h +++ b/gcc/cp/cp-objcp-common.h @@ -94,6 +94,8 @@ extern void cp_common_init_ts (void); #define LANG_HOOKS_TYPE_HASH_EQ cxx_type_hash_eq #undef LANG_HOOKS_MISSING_NORETURN_OK_P #define LANG_HOOKS_MISSING_NORETURN_OK_P cp_missing_noreturn_ok_p +#undef LANG_HOOKS_BLOCK_MAY_FALLTHRU +#define LANG_HOOKS_BLOCK_MAY_FALLTHRU cxx_block_may_fallthru /* Attribute hooks. */ #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 8592125..85c8e7c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6019,6 +6019,7 @@ extern bool cp_var_mod_type_p (tree, tree); extern void cxx_initialize_diagnostics (diagnostic_context *); extern int cxx_types_compatible_p (tree, tree); extern void init_shadowed_var_for_decl (void); +extern bool cxx_block_may_fallthru (const_tree); /* in cp-gimplify.c */ extern int cp_gimplify_expr (tree *, gimple_seq *, |