diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e610ce5552a7..bc6e789bf51a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-05-17 Bernd Schmidt + + * g++.dg/opt/temp2.C: New test. + 2006-05-17 Jakub Jelinek PR c++/27491 diff --git a/gcc/testsuite/g++.dg/opt/temp2.C b/gcc/testsuite/g++.dg/opt/temp2.C new file mode 100644 index 000000000000..35520a2427c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/temp2.C @@ -0,0 +1,62 @@ +// { dg-do run } + +// Copyright (C) 2006 Free Software Foundation, Inc. + +// Originally from PR 16681, found also in init/array15.C +// This variant of the testcase verifies that we do not create +// a temporary on the stack, which is PR 27620. + +int i; + +extern "C" +void *memcpy (void *dest, const void *src, __SIZE_TYPE__ n) +{ + char *d = (char *) dest; + const char *s = (const char *) src; + while (n--) + d[n] = s[n]; + ++i; + return dest; +} + +struct foo { + unsigned char buffer[41112]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer); ix--;) + if (buffer[ix]) + return false; + return true; +} + +void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[50000]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + i = 0; + foo *f = new (heap) foo (); + + if (i != 0) + return 1; + if (!f->check ()) + return 1; + return 0; +} + +