diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2011-06-17 02:20:11 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2011-06-17 02:20:11 +0000 |
commit | 041efc9a53583539ac562f7d4427410278e20e54 (patch) | |
tree | 00a637e01acb72f184ab84abb8fdf3424a3ce2d0 /gcc | |
parent | 9a2091cd0a703e199c2c50225930071d00675a32 (diff) | |
download | gcc-041efc9a53583539ac562f7d4427410278e20e54.zip gcc-041efc9a53583539ac562f7d4427410278e20e54.tar.gz gcc-041efc9a53583539ac562f7d4427410278e20e54.tar.bz2 |
re PR rtl-optimization/48542 (unchanged variables in code which calls setjmp may be clobbered (including the return-address))
PR rtl-optimization/48542
* gcc.dg/torture/pr48542.c: New test.
From-SVN: r175133
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr48542.c | 57 |
2 files changed, 62 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b4a7540..8fe2a03 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-06-17 Hans-Peter Nilsson <hp@axis.com> + + PR rtl-optimization/48542 + * gcc.dg/torture/pr48542.c: New test. + 2011-06-16 Jason Merrill <jason@redhat.com> PR c++/44160 diff --git a/gcc/testsuite/gcc.dg/torture/pr48542.c b/gcc/testsuite/gcc.dg/torture/pr48542.c new file mode 100644 index 0000000..e3e4948 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr48542.c @@ -0,0 +1,57 @@ +/* { dg-do run } */ +/* The return-address was clobbered. */ +#include <stdlib.h> +#include <setjmp.h> + +jmp_buf env; +extern void sub(void); +extern void sub3(void); +int called; +__attribute__ ((__noinline__)) +int sjtest() +{ + int i; + if (setjmp(env)) + return 99; + + for (i = 0; i < 10; i++) + sub(); + + longjmp(env, 1); +} + +__attribute__ ((__noinline__)) +void sub(void) +{ + called++; +} + +int called3; +__attribute__ ((__noinline__)) +int sjtest3() +{ + int i; + if (setjmp(env)) + return 42; + + for (i = 0; i < 10; i++) + sub3(); + return 0; +} + +__attribute__ ((__noinline__)) +void sub3(void) +{ + called3++; + if (called3 == 10) + longjmp (env, 1); +} + +int main(void) +{ + if (sjtest() != 99 || called != 10) + abort(); + if (sjtest3() != 42 || called3 != 10) + abort(); + exit (0); +} |