aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-12-21 15:51:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-12-21 15:51:19 +0100
commitbccc50d44c8b79ecb6b0237912e96369e5625d17 (patch)
tree2b7fe3b05edf700cf89f2391169f78c73ef31628 /gcc/testsuite
parent2091795abd48effcbfe9407b7954021473175b0a (diff)
downloadgcc-bccc50d44c8b79ecb6b0237912e96369e5625d17.zip
gcc-bccc50d44c8b79ecb6b0237912e96369e5625d17.tar.gz
gcc-bccc50d44c8b79ecb6b0237912e96369e5625d17.tar.bz2
re PR middle-end/51644 (va_list vs. warning: ‘noreturn’ function does return is not fixable)
PR middle-end/51644 PR middle-end/51647 * tree-eh.c (decide_copy_try_finally): At -O0, return true even when ndests is not 1, if there are only gimple_clobber_p (or debug) stmts in the finally sequence. * tree-inline.c (estimate_num_insns): Return 0 for gimple_clobber_p stmts. * gcc.dg/pr51644.c: New test. * g++.dg/warn/Wreturn-4.C: New test. From-SVN: r182589
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/warn/Wreturn-4.C48
-rw-r--r--gcc/testsuite/gcc.dg/pr51644.c33
3 files changed, 88 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9228371..b0e247c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2011-12-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/51644
+ PR middle-end/51647
+ * gcc.dg/pr51644.c: New test.
+ * g++.dg/warn/Wreturn-4.C: New test.
+
2011-12-21 Michael Zolotukhin <michael.v.zolotukhin@intel.com>
* gcc.dg/vect/no-section-anchors-vect-31.c: Adjust array size and test
diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-4.C b/gcc/testsuite/g++.dg/warn/Wreturn-4.C
new file mode 100644
index 0000000..7d751f2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wreturn-4.C
@@ -0,0 +1,48 @@
+// PR middle-end/51647
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+enum PropertyAttributes { NONE = 1 };
+enum PropertyType { NORMAL = 0, FIELD = 1 };
+class LookupResult;
+
+template <typename T>
+struct Handle
+{
+ inline explicit Handle (T *obj) __attribute__ ((always_inline)) {}
+ inline T *operator-> () const __attribute__ ((always_inline)) { return 0; }
+};
+
+struct JSObject
+{
+ bool IsGlobalObject () { return false; }
+};
+
+struct Isolate
+{
+ LookupResult *top_lookup_result () { return 0; }
+};
+
+struct LookupResult
+{
+ explicit LookupResult (Isolate *isolate) {}
+ JSObject *holder () { return 0; }
+ PropertyType type () { return NORMAL; }
+};
+
+int
+test (LookupResult *lookup)
+{
+ Handle <JSObject> holder (lookup->holder ());
+ switch (lookup->type ())
+ {
+ case NORMAL:
+ if (holder->IsGlobalObject ())
+ return 2;
+ else
+ return 3;
+ break;
+ default:
+ return 4;
+ }
+} // { dg-bogus "control reaches end of non-void function" }
diff --git a/gcc/testsuite/gcc.dg/pr51644.c b/gcc/testsuite/gcc.dg/pr51644.c
new file mode 100644
index 0000000..2038a0c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr51644.c
@@ -0,0 +1,33 @@
+/* PR middle-end/51644 */
+/* { dg-do compile } */
+/* { dg-options "-Wall -fexceptions" } */
+
+#include <stdarg.h>
+
+extern void baz (int, va_list) __attribute__ ((__noreturn__));
+
+__attribute__ ((__noreturn__))
+void
+foo (int s, ...)
+{
+ va_list ap;
+ va_start (ap, s);
+ baz (s, ap);
+ va_end (ap);
+} /* { dg-bogus "function does return" } */
+
+__attribute__ ((__noreturn__))
+void
+bar (int s, ...)
+{
+ va_list ap1;
+ va_start (ap1, s);
+ {
+ va_list ap2;
+ va_start (ap2, s);
+ baz (s, ap1);
+ baz (s, ap2);
+ va_end (ap2);
+ }
+ va_end (ap1);
+} /* { dg-bogus "function does return" } */