aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2004-06-15 16:38:40 -0400
committerJason Merrill <jason@gcc.gnu.org>2004-06-15 16:38:40 -0400
commiteae29fe1dcd76ead474050e5849a6e36ae1f8b29 (patch)
tree5a741a9062fb19b8f1ff54736d18f0f1cd113d27
parent0566b51e1fc647d43e1a2dedc8a2d80acd70e1d5 (diff)
downloadgcc-eae29fe1dcd76ead474050e5849a6e36ae1f8b29.zip
gcc-eae29fe1dcd76ead474050e5849a6e36ae1f8b29.tar.gz
gcc-eae29fe1dcd76ead474050e5849a6e36ae1f8b29.tar.bz2
re PR tree-optimization/14107 (Return warnings don't work without optimizations enabled)
PR tree-optimization/14107 * decl.c (finish_function): Warn about no return in all functions. From-SVN: r83198
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/testsuite/g++.dg/init/new10.C8
-rw-r--r--gcc/testsuite/g++.dg/warn/Wreturn-type-1.C11
-rw-r--r--gcc/testsuite/g++.old-deja/g++.brendan/crash52.C3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/report.C4
6 files changed, 32 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 518d73a..7b61cfc 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2004-06-12 Jason Merrill <jason@redhat.com>
+
+ PR tree-optimization/14107
+ * decl.c (finish_function): Warn about no return in all functions.
+
2004-06-15 Paolo Bonzini <bonzini@gnu.org>
* cp-tree.h (struct language_function): Remove cannot_inline.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 44a83d4..92c6cf0 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10803,10 +10803,13 @@ finish_function (int flags)
&& !current_function_returns_value && !current_function_returns_null
/* Don't complain if we abort or throw. */
&& !current_function_returns_abnormally
- && !DECL_NAME (DECL_RESULT (fndecl))
+ && !DECL_NAME (DECL_RESULT (fndecl)))
+#if 0
+ /* Enable this for all functions until bug 14107 is fixed properly. */
/* Normally, with -Wreturn-type, flow will complain. Unless we're an
inline function, as we might never be compiled separately. */
&& (DECL_INLINE (fndecl) || processing_template_decl))
+#endif
warning ("no return statement in function returning non-void");
/* Store the end of the function, so that we get good line number
diff --git a/gcc/testsuite/g++.dg/init/new10.C b/gcc/testsuite/g++.dg/init/new10.C
new file mode 100644
index 0000000..e19629b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/new10.C
@@ -0,0 +1,8 @@
+// PR c++/14452
+// We got confused trying to preevaluate the new-initializer.
+
+struct S {};
+void foo (bool b)
+{
+ new S(b ? S() : S());
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C
new file mode 100644
index 0000000..fb9a862
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C
@@ -0,0 +1,11 @@
+// PR c++/11725
+// { dg-options "-Wreturn-type" }
+
+template <class T>
+struct A
+{
+ int foo()
+ {
+ throw "Stop";
+ }
+};
diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/crash52.C b/gcc/testsuite/g++.old-deja/g++.brendan/crash52.C
index 9e72fb5..95c6a08 100644
--- a/gcc/testsuite/g++.old-deja/g++.brendan/crash52.C
+++ b/gcc/testsuite/g++.old-deja/g++.brendan/crash52.C
@@ -10,4 +10,5 @@ public:
A &f(A &a) {// { dg-error "" } new decl.*
std::cout << "Blah\n";
-}
+} // { dg-warning "" } no return
+
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/report.C b/gcc/testsuite/g++.old-deja/g++.jason/report.C
index 13557f1..0149129 100644
--- a/gcc/testsuite/g++.old-deja/g++.jason/report.C
+++ b/gcc/testsuite/g++.old-deja/g++.jason/report.C
@@ -56,7 +56,7 @@ bar2 baz (X::Y y)
bar2 wa [5];
wa[0] = baz(f);
undef2 (1); // { dg-error "" } implicit declaration
-}
+} // { dg-warning "" } no return
int ninny ()
{
@@ -71,4 +71,4 @@ int ninny ()
int darg (char X::*p)
{
undef3 (1); // { dg-error "" } implicit declaration
-}
+} // { dg-warning "" } no return