1/* { dg-do compile } */
2/* { dg-options "-O3 -fdump-tree-optimized" } */
3
4typedef __SIZE_TYPE__ size_t;
5inline void* operator new(size_t, void* p) throw() { return p; }
6
7typedef void (*handler_t)(void);
8extern handler_t get_handle();
9
10inline void* operator new(size_t sz)
11{
12  void *p;
13
14  if (sz == 0)
15    sz = 1;
16
17  while ((p = __builtin_malloc (sz)) == 0)
18    {
19      handler_t handler = get_handle ();
20      if (! handler)
21        throw 42;
22      handler ();
23    }
24  return p;
25}
26
27struct vect {
28  int *start, *end;
29  vect(size_t n) {
30    start = end = 0;
31    if (n > (size_t)-1 / sizeof(int))
32      throw 33;
33    if (n != 0)
34      start = static_cast<int*> (operator new (n * sizeof(int)));
35    end = start + n;
36    int *p = start;
37    for (size_t l = n; l > 0; --l, ++p)
38      *p = 0;
39  }
40};
41
42void f (void *p, int n)
43{
44  new (p) vect(n);
45}
46
47/* { dg-final { scan-tree-dump-times "calloc" 1 "optimized" } } */
48/* { dg-final { scan-tree-dump-not "malloc" "optimized" } } */
49/* { dg-final { scan-tree-dump-not "memset" "optimized" } } */
50/* { dg-final { cleanup-tree-dump "optimized" } } */
51