aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-11-23 17:04:03 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-11-23 17:04:03 +0100
commit88cd0e88e36515f01b6f1e398358dc11cc06c389 (patch)
tree756c94d3f1786802105c930a7ed81bf4e39c9a8d /gcc/cp
parent340ef734b8072d2b58f946bb69170f2e535813d7 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/cp-objcp-common.c19
-rw-r--r--gcc/cp/cp-objcp-common.h2
-rw-r--r--gcc/cp/cp-tree.h1
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 *,