Commit bccc50d4 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 2091795a
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
......
// 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" }
/* 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" } */
......@@ -1538,7 +1538,20 @@ decide_copy_try_finally (int ndests, bool may_throw, gimple_seq finally)
}
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);
......
......@@ -3482,6 +3482,9 @@ estimate_num_insns (gimple stmt, eni_weights *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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment