From: Jakub Jelinek Date: Sun, 18 Nov 2007 22:20:54 +0000 (+0100) Subject: re PR c++/30988 (Incorrect "no return statement" warning with __attribute__ ((noretur... X-Git-Tag: releases/gcc-4.3.0~1446 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be461b8fb95064a8023d5a3da48399c44bc99193;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 00b18f84fd81..193931ddfc17 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 23e13f3230fa..1ae7d0f7bbcf 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 21d81113450c..12eb5486254c 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 000000000000..7ef76cc5bc37 --- /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 000000000000..77d4890df2fb --- /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 000000000000..fdbc42516a13 --- /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 000000000000..a869b7016fe8 --- /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" } +};