diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-11-18 23:20:54 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-18 23:20:54 +0100 |
commit | be461b8fb95064a8023d5a3da48399c44bc99193 (patch) | |
tree | fd631341f17c43e2699cf70dbcd34cf152e5b020 | |
parent | bce8455643b69ae0ba84ef84592dc75cb746a668 (diff) | |
download | gcc-be461b8fb95064a8023d5a3da48399c44bc99193.zip gcc-be461b8fb95064a8023d5a3da48399c44bc99193.tar.gz gcc-be461b8fb95064a8023d5a3da48399c44bc99193.tar.bz2 |
re PR c++/30988 (Incorrect "no return statement" warning with __attribute__ ((noreturn)) and __FUNCTION__)
PR c++/30988
semantics.c (finish_call_expr): Set current_function_returns_abnormally
if fn is noreturn FUNCTION_DECL or OVERLOAD with all noreturn
functions.
* g++.dg/warn/noreturn-4.C: New test.
* g++.dg/warn/noreturn-5.C: New test.
* g++.dg/warn/noreturn-6.C: New test.
* g++.dg/warn/noreturn-7.C: New test.
From-SVN: r130280
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/noreturn-4.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/noreturn-5.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/noreturn-6.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/noreturn-7.C | 15 |
7 files changed, 85 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 00b18f8..193931d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2007-11-18 Jakub Jelinek <jakub@redhat.com> + + PR c++/30988 + semantics.c (finish_call_expr): Set current_function_returns_abnormally + if fn is noreturn FUNCTION_DECL or OVERLOAD with all noreturn + functions. + 2007-11-16 Jakub Jelinek <jakub@redhat.com> PR c++/34100 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 23e13f3..1ae7d0f 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1846,6 +1846,20 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p) { result = build_nt_call_list (fn, args); KOENIG_LOOKUP_P (result) = koenig_p; + if (cfun) + { + do + { + tree fndecl = OVL_CURRENT (fn); + if (TREE_CODE (fndecl) != FUNCTION_DECL + || !TREE_THIS_VOLATILE (fndecl)) + break; + fn = OVL_NEXT (fn); + } + while (fn); + if (!fn) + current_function_returns_abnormally = 1; + } return result; } if (!BASELINK_P (fn) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 21d8111..12eb548 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2007-11-18 Jakub Jelinek <jakub@redhat.com> + + PR c++/30988 + * g++.dg/warn/noreturn-4.C: New test. + * g++.dg/warn/noreturn-5.C: New test. + * g++.dg/warn/noreturn-6.C: New test. + * g++.dg/warn/noreturn-7.C: New test. + 2007-11-18 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/32770 diff --git a/gcc/testsuite/g++.dg/warn/noreturn-4.C b/gcc/testsuite/g++.dg/warn/noreturn-4.C new file mode 100644 index 0000000..7ef76cc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-4.C @@ -0,0 +1,13 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *) __attribute__ ((noreturn)); + +template <typename T> struct A +{ + int g () + { + f (__FUNCTION__); + } +}; diff --git a/gcc/testsuite/g++.dg/warn/noreturn-5.C b/gcc/testsuite/g++.dg/warn/noreturn-5.C new file mode 100644 index 0000000..77d4890 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-5.C @@ -0,0 +1,15 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *) __attribute__ ((noreturn)); +void f (int) __attribute__ ((noreturn)); +void f (double) __attribute__ ((noreturn)); + +template <typename T> struct A +{ + int g () + { + f ((T) 0); + } +}; diff --git a/gcc/testsuite/g++.dg/warn/noreturn-6.C b/gcc/testsuite/g++.dg/warn/noreturn-6.C new file mode 100644 index 0000000..fdbc425 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-6.C @@ -0,0 +1,13 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *); + +template <typename T> struct A +{ + int g () + { + f (__FUNCTION__); + } // { dg-warning "no return statement in function returning non-void" } +}; diff --git a/gcc/testsuite/g++.dg/warn/noreturn-7.C b/gcc/testsuite/g++.dg/warn/noreturn-7.C new file mode 100644 index 0000000..a869b70 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-7.C @@ -0,0 +1,15 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *) __attribute__ ((noreturn)); +void f (int); +void f (double) __attribute__ ((noreturn)); + +template <typename T> struct A +{ + int g () + { + f ((T) 0); + } // { dg-warning "no return statement in function returning non-void" } +}; |