| /* PR c++/100876 - -Wmismatched-new-delete should either look through |
| or ignore placement new |
| { dg-do compile } |
| { dg-options "-O0 -Wall -Wno-array-bounds" } */ |
| |
| inline void* operator new (__SIZE_TYPE__, void *p) { return p; } |
| inline void* operator new[] (__SIZE_TYPE__, void *p) { return p; } |
| |
| void* nowarn_placement_new_memset () |
| { |
| struct S { int i; }; |
| void *p = __builtin_malloc (sizeof (S)); |
| S *q = new (p) S; |
| __builtin_memset (q, 0, sizeof (S)); |
| return q; |
| } |
| |
| void* warn_placement_new_memset () |
| { |
| struct S { int i; }; |
| void *p = __builtin_malloc (sizeof (S)); |
| S *q = new (p) S; |
| __builtin_memset (q, 0, sizeof (S) + 1); // { dg-warning "\\\[-Wstringop-overflow" } |
| return q; |
| } |
| |
| void* nowarn_placement_new_array_strncpy (const char *s) |
| { |
| void *p = __builtin_malloc (5); |
| char *q = new (p) char[5]; |
| __builtin_strncpy (q, s, 5); |
| return q; |
| |
| } |
| |
| void* warn_placement_new_array_strncpy (const char *s) |
| { |
| void *p = __builtin_malloc (4); |
| char *q = new (p) char[5]; |
| __builtin_strncpy (q, s, 5); // { dg-warning "\\\[-Wstringop-overflow" } |
| return q; |
| } |