From 2889212c90f3739eefe9eb008b48279024bcfb3a Mon Sep 17 00:00:00 2001 From: jakub Date: Sun, 18 Nov 2007 22:20:54 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130280 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/semantics.c | 14 ++++++++++++++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/warn/noreturn-4.C | 13 +++++++++++++ gcc/testsuite/g++.dg/warn/noreturn-5.C | 15 +++++++++++++++ gcc/testsuite/g++.dg/warn/noreturn-6.C | 13 +++++++++++++ gcc/testsuite/g++.dg/warn/noreturn-7.C | 15 +++++++++++++++ 7 files changed, 85 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/noreturn-4.C create mode 100644 gcc/testsuite/g++.dg/warn/noreturn-5.C create mode 100644 gcc/testsuite/g++.dg/warn/noreturn-6.C create mode 100644 gcc/testsuite/g++.dg/warn/noreturn-7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 00b18f84fd8..193931ddfc1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2007-11-18 Jakub Jelinek + + 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 PR c++/34100 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 23e13f3230f..1ae7d0f7bbc 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 21d81113450..12eb5486254 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2007-11-18 Jakub Jelinek + + 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 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 00000000000..7ef76cc5bc3 --- /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 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 00000000000..77d4890df2f --- /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 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 00000000000..fdbc42516a1 --- /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 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 00000000000..a869b7016fe --- /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 struct A +{ + int g () + { + f ((T) 0); + } // { dg-warning "no return statement in function returning non-void" } +}; -- 2.11.4.GIT