aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-01-11 22:14:51 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2009-01-11 22:14:51 +0100
commitf74d9c8f93943ea69270c6b66750080df1531d79 (patch)
tree29ec436df5d319951ef862f4e7a821905a5cb035
parent79ee9e8be85fa3bbe63c49ff5c789e896d71fdfe (diff)
downloadgcc-f74d9c8f93943ea69270c6b66750080df1531d79.zip
gcc-f74d9c8f93943ea69270c6b66750080df1531d79.tar.gz
gcc-f74d9c8f93943ea69270c6b66750080df1531d79.tar.bz2
re PR c++/36254 (wrong "control reaches end of non-void function" warning with IF_STMT)
PR c++/36254 * cp-gimplify.c (genericize_if_stmt): Renamed from ... (gimplify_if_stmt): ... this. (cp_gimplify_expr): Don't handle IF_STMT here. (cp_genericize_r): Call genericize_if_stmt for IF_STMT. * g++.dg/warn/Wreturn-type-5.C: New test. From-SVN: r143281
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cp-gimplify.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/Wreturn-type-5.C21
4 files changed, 43 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b1542f0..7b0c39f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2009-01-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/36254
+ * cp-gimplify.c (genericize_if_stmt): Renamed from ...
+ (gimplify_if_stmt): ... this.
+ (cp_gimplify_expr): Don't handle IF_STMT here.
+ (cp_genericize_r): Call genericize_if_stmt for IF_STMT.
+
2009-01-10 Andrew Pinski <pinskia@gmail.com>
PR c++/38648
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 144de3f..99738ea 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1,6 +1,6 @@
/* C++-specific tree lowering bits; see also c-gimplify.c and tree-gimple.c.
- Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by Jason Merrill <jason@redhat.com>
@@ -158,7 +158,7 @@ genericize_eh_spec_block (tree *stmt_p)
/* Genericize an IF_STMT by turning it into a COND_EXPR. */
static void
-gimplify_if_stmt (tree *stmt_p)
+genericize_if_stmt (tree *stmt_p)
{
tree stmt, cond, then_, else_;
location_t locus = EXPR_LOCATION (*stmt_p);
@@ -611,11 +611,6 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
ret = GS_ALL_DONE;
break;
- case IF_STMT:
- gimplify_if_stmt (expr_p);
- ret = GS_OK;
- break;
-
case FOR_STMT:
gimplify_for_stmt (expr_p, pre_p);
ret = GS_OK;
@@ -803,6 +798,13 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
CLEANUP_BODY (stmt),
CLEANUP_EXPR (stmt));
+ else if (TREE_CODE (stmt) == IF_STMT)
+ {
+ genericize_if_stmt (stmt_p);
+ /* *stmt_p has changed, tail recurse to handle it again. */
+ return cp_genericize_r (stmt_p, walk_subtrees, data);
+ }
+
/* COND_EXPR might have incompatible types in branches if one or both
arms are bitfields. Fix it up now. */
else if (TREE_CODE (stmt) == COND_EXPR)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f8b0c49..c717262 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-01-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/36254
+ * g++.dg/warn/Wreturn-type-5.C: New test.
+
2009-01-11 Matthias Klose <doko@ubuntu.com>
PR middle-end/38616
diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C
new file mode 100644
index 0000000..8a19d64
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C
@@ -0,0 +1,21 @@
+// PR c++/36254
+// { dg-do compile }
+// { dg-options "-Wreturn-type" }
+
+int i, j, k;
+struct X { X (); ~X (); };
+
+bool
+foo ()
+{
+ X x;
+ if (i && j)
+ {
+ if (k)
+ return true;
+ else
+ return false;
+ }
+ else
+ return false;
+}