80 lines
1.2 KiB
C
80 lines
1.2 KiB
C
// PR tree-optimization/27549
|
|
// { dg-do compile }
|
|
// { dg-options "-O2" }
|
|
|
|
typedef __SIZE_TYPE__ size_t;
|
|
|
|
struct E
|
|
{
|
|
virtual ~E () {}
|
|
virtual size_t e () const = 0;
|
|
virtual void f (char *x) const = 0;
|
|
};
|
|
|
|
struct F : public E
|
|
{
|
|
F () {}
|
|
virtual ~F () {}
|
|
virtual size_t e () const { return 0; }
|
|
virtual void f (char *x) const { *x = '\0'; }
|
|
};
|
|
|
|
struct S
|
|
{
|
|
S () { a = new char[32]; b = 32; c = 0; a[0] = 0; }
|
|
void s (const char *x, size_t y) { v (c + y + 1); __builtin_memcpy(a + c, x, y); c += y; a[c] = '\0'; }
|
|
void s (const E *x) { size_t l = x->e(); v (c + l + 1); x->f (a + c); c += l; }
|
|
const char *t () { return a; }
|
|
void v (size_t n)
|
|
{
|
|
if (b >= n) return;
|
|
|
|
size_t b2 = b;
|
|
char *a2 = a;
|
|
|
|
for (;;)
|
|
{
|
|
b *= 2;
|
|
if (b >= n)
|
|
break;
|
|
}
|
|
|
|
a = new char[b];
|
|
|
|
if (b2)
|
|
{
|
|
__builtin_memcpy(a, a2, c);
|
|
a2[0] = 0;
|
|
for (size_t i = 1; i < b2; i++)
|
|
a2[i] = a2[i - 1];
|
|
delete[] a2;
|
|
}
|
|
}
|
|
|
|
~S ()
|
|
{
|
|
if (b)
|
|
{
|
|
a[0] = 0;
|
|
for (size_t i = 1; i < b; i++)
|
|
a[i] = a[i - 1];
|
|
}
|
|
delete[] a;
|
|
}
|
|
char * a;
|
|
size_t b, c;
|
|
};
|
|
|
|
const char *p;
|
|
size_t q;
|
|
const F u;
|
|
|
|
const char *
|
|
foo ()
|
|
{
|
|
S s;
|
|
s.s (p, q);
|
|
s.s (&u);
|
|
return s.t ();
|
|
}
|