diff options
author | Jason Merrill <jason@redhat.com> | 2004-06-15 16:38:40 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2004-06-15 16:38:40 -0400 |
commit | eae29fe1dcd76ead474050e5849a6e36ae1f8b29 (patch) | |
tree | 5a741a9062fb19b8f1ff54736d18f0f1cd113d27 | |
parent | 0566b51e1fc647d43e1a2dedc8a2d80acd70e1d5 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/new10.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wreturn-type-1.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.brendan/crash52.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.jason/report.C | 4 |
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 |