I added a C++ test with a .c extension. Oops. Corrected in the obvious way :-) Committed to the trunk.
* g++.dg/pr61289-2.C: Renamed from pr61289-2.c. diff --git a/gcc/testsuite/g++.dg/pr61289-2.C b/gcc/testsuite/g++.dg/pr61289-2.C new file mode 100644 index 0000000..4cc3ebe --- /dev/null +++ b/gcc/testsuite/g++.dg/pr61289-2.C @@ -0,0 +1,62 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-exceptions" } */ +struct S +{ + inline int fn1 () const { return s; } + __attribute__ ((noinline, noclone)) S *fn2 (int); + __attribute__ ((noinline, noclone)) void fn3 (); + __attribute__ ((noinline, noclone)) static S *fn4 (int); + S (int i) : s (i) {} + int s; +}; + +int a = 0; +S *b = 0; + +S * +S::fn2 (int i) +{ + a++; + if (a == 1) + return b; + if (a > 3) + __builtin_abort (); + b = this; + return new S (i + s); +} + +S * +S::fn4 (int i) +{ + b = new S (i); + return b; +} + +void +S::fn3 () +{ + delete this; +} + +void +foo () +{ + S *c = S::fn4 (20); + for (int i = 0; i < 2;) + { + S *d = c->fn2 (c->fn1 () + 10); + if (c != d) +{ + c->fn3 (); + c = d; + ++i; +} + } + c->fn3 (); +} + +int +main () +{ + foo (); +} diff --git a/gcc/testsuite/g++.dg/pr61289-2.c b/gcc/testsuite/g++.dg/pr61289-2.c deleted file mode 100644 index 4cc3ebe..0000000 --- a/gcc/testsuite/g++.dg/pr61289-2.c +++ /dev/null @@ -1,62 +0,0 @@ -/* { dg-do run } */ -/* { dg-options "-O2 -fno-exceptions" } */ -struct S -{ - inline int fn1 () const { return s; } - __attribute__ ((noinline, noclone)) S *fn2 (int); - __attribute__ ((noinline, noclone)) void fn3 (); - __attribute__ ((noinline, noclone)) static S *fn4 (int); - S (int i) : s (i) {} - int s; -}; - -int a = 0; -S *b = 0; - -S * -S::fn2 (int i) -{ - a++; - if (a == 1) - return b; - if (a > 3) - __builtin_abort (); - b = this; - return new S (i + s); -} - -S * -S::fn4 (int i) -{ - b = new S (i); - return b; -} - -void -S::fn3 () -{ - delete this; -} - -void -foo () -{ - S *c = S::fn4 (20); - for (int i = 0; i < 2;) - { - S *d = c->fn2 (c->fn1 () + 10); - if (c != d) -{ - c->fn3 (); - c = d; - ++i; -} - } - c->fn3 (); -} - -int -main () -{ - foo (); -}