]> gcc.gnu.org Git - gcc.git/commitdiff
re PR c++/30988 (Incorrect "no return statement" warning with __attribute__ ((noretur...
authorJakub Jelinek <jakub@redhat.com>
Sun, 18 Nov 2007 22:20:54 +0000 (23:20 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 18 Nov 2007 22:20:54 +0000 (23:20 +0100)
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

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/noreturn-4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/noreturn-5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/noreturn-6.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/noreturn-7.C [new file with mode: 0644]

index 00b18f84fd81e2e43023f92208923be98a33d1ee..193931ddfc17bee58c20487d76e189f70912292d 100644 (file)
@@ -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
index 23e13f3230faa559e943d6323b1f7da2888d60d4..1ae7d0f7bbcfbf9e2d68b704697216befa0d16b3 100644 (file)
@@ -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)
index 21d81113450cd279b7993676da719e9956990cb6..12eb5486254cb81703f62f7cdc6bb77469539554 100644 (file)
@@ -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 (file)
index 0000000..7ef76cc
--- /dev/null
@@ -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 (file)
index 0000000..77d4890
--- /dev/null
@@ -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 (file)
index 0000000..fdbc425
--- /dev/null
@@ -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 (file)
index 0000000..a869b70
--- /dev/null
@@ -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" }
+};
This page took 0.146371 seconds and 5 git commands to generate.