re PR tree-optimization/49243 (attribute((returns_twice)) doesn't work)

2011-06-06  Mikael Pettersson  <mikpe@it.uu.se>

	PR tree-optimization/49243
	* calls.c (setjmp_call_p): Also check if fndecl has the
	returns_twice attribute.

	* gcc.dg/pr49243.c: New.

From-SVN: r174695
This commit is contained in:
Mikael Pettersson 2011-06-06 13:43:31 +02:00 committed by Richard Biener
parent 38fbfaf6fb
commit 275311c494
4 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2011-06-06 Mikael Pettersson <mikpe@it.uu.se>
PR tree-optimization/49243
* calls.c (setjmp_call_p): Also check if fndecl has the
returns_twice attribute.
2011-06-06 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* config/mips/iris6.h (ENDFILE_SPEC): Use crtfastmath.o if

View File

@ -567,6 +567,8 @@ special_function_p (const_tree fndecl, int flags)
int
setjmp_call_p (const_tree fndecl)
{
if (DECL_IS_RETURNS_TWICE (fndecl))
return ECF_RETURNS_TWICE;
return special_function_p (fndecl, 0) & ECF_RETURNS_TWICE;
}

View File

@ -1,3 +1,8 @@
2011-06-06 Mikael Pettersson <mikpe@it.uu.se>
PR tree-optimization/49243
* gcc.dg/pr49243.c: New.
2011-06-06 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/cond_expr1.ads: New test.

View File

@ -0,0 +1,25 @@
/* PR tree-optimization/49243 */
/* { dg-do compile } */
/* { dg-options "-O2 -Winline" } */
extern unsigned long jb[];
extern int my_setjmp(unsigned long jb[]) __attribute__((returns_twice));
extern int decode(const char*);
static inline int wrapper(const char **s_ptr) /* { dg-warning "(inlining failed|function 'wrapper' can never be inlined because it uses setjmp)" } */
{
if (my_setjmp(jb) == 0) {
const char *s = *s_ptr;
while (decode(s) != 0)
*s_ptr = ++s;
return 0;
} else
return -1;
}
void parse(const char *data)
{
const char *s = data;
if (!(wrapper(&s) == -1 && (s - data) == 1)) /* { dg-warning "called from here" } */
__builtin_abort();
}