1// PR tree-optimization/27549
2// { dg-do compile }
3// { dg-options "-O2" }
4
5typedef __SIZE_TYPE__ size_t;
6
7struct E
8{
9  virtual ~E () {}
10  virtual size_t e () const = 0;
11  virtual void f (char *x) const = 0;
12};
13
14struct F : public E
15{
16  virtual ~F () {}
17  virtual size_t e () const { return 0; }
18  virtual void f (char *x) const { *x = '\0'; }
19};
20
21struct S
22{
23  S () { a = new char[32]; b = 32; c = 0; a[0] = 0; }
24  void s (const char *x, size_t y) { v (c + y + 1); __builtin_memcpy(a + c, x, y); c += y; a[c] = '\0'; }
25  void s (const E *x) { size_t l = x->e(); v (c + l + 1); x->f (a + c); c += l; }
26  const char *t () { return a; }
27  void v (size_t n)
28    {
29      if (b >= n) return;
30
31      size_t b2 = b;
32      char *a2 = a;
33
34      for (;;)
35	{
36	  b *= 2;
37	  if (b >= n)
38	    break;
39	}
40
41      a = new char[b];
42
43      if (b2)
44	{
45	  __builtin_memcpy(a, a2, c);
46	  a2[0] = 0;
47	  for (size_t i = 1; i < b2; i++)
48	    a2[i] = a2[i - 1];
49	  delete[] a2;
50	}
51    }
52
53  ~S ()
54    {
55      if (b)
56	{
57	  a[0] = 0;
58	  for (size_t i = 1; i < b; i++)
59	    a[i] = a[i - 1];
60	}
61      delete[] a;
62    }
63  char * a;
64  size_t b, c;
65};
66
67const char *p;
68size_t q;
69const F u;
70
71const char *
72foo ()
73{
74  S s;
75  s.s (p, q);
76  s.s (&u);
77  return s.t ();
78}
79