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