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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182589
138bc75d-0d04-0410-961f-
82ee72b054a4
+2011-12-21 Jakub Jelinek <jakub@redhat.com>
+
+ 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.
+
2011-12-21 Aldy Hernandez <aldyh@redhat.com>
PR middle-end/51472
+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
--- /dev/null
+// 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" }
--- /dev/null
+/* 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" } */
}
if (!optimize)
- return ndests == 1;
+ {
+ gimple_stmt_iterator gsi;
+
+ if (ndests == 1)
+ return true;
+
+ for (gsi = gsi_start (finally); !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gimple stmt = gsi_stmt (gsi);
+ if (!is_gimple_debug (stmt) && !gimple_clobber_p (stmt))
+ return false;
+ }
+ return true;
+ }
/* Finally estimate N times, plus N gotos. */
f_estimate = count_insns_seq (finally, &eni_size_weights);
likely be a real store, so the cost of the GIMPLE_ASSIGN is the cost
of moving something into "a", which we compute using the function
estimate_move_cost. */
+ if (gimple_clobber_p (stmt))
+ return 0; /* ={v} {CLOBBER} stmt expands to nothing. */
+
lhs = gimple_assign_lhs (stmt);
rhs = gimple_assign_rhs1 (stmt);