| // PR c++/93529 |
| // P1009: Array size deduction in new-expressions |
| // { dg-do run { target c++11 } } |
| |
| // When the array bound is deduced to 0, malloc(0) returns |
| // a non-dereferenceable pointer. |
| int *p0 = new int[]{}; |
| int *p1 = new int[]{ 1 }; |
| int *p2 = new int[]{ 1, 2, 3 }; |
| char *c1 = new char[]{"foo"}; |
| #if __cpp_aggregate_paren_init |
| int *q0 = new int[](); |
| int *q1 = new int[](1); |
| int *q2 = new int[](1, 2, 3); |
| char *d1 = new char[]("foo"); |
| char *d2 = new char[4]("foo"); |
| char *d3 = new char[]((("foo"))); |
| #endif |
| |
| struct Aggr { int a; int b; int c; }; |
| Aggr *a1 = new Aggr[]{}; |
| Aggr *a2 = new Aggr[]{ 1, 2, 3 }; |
| Aggr *a3 = new Aggr[]{ 1, 2, 3, 4 }; |
| Aggr *a4 = new Aggr[]{ { 1, 2, 3 } }; |
| Aggr *a5 = new Aggr[]{ { 1 }, { 6, 7 } }; |
| #if __cpp_designated_initializers |
| Aggr *a9 = new Aggr[]{ { .a = 1, .b = 2, .c = 3 } }; |
| #endif |
| #if __cpp_aggregate_paren_init |
| Aggr *a6 = new Aggr[](); |
| Aggr *a7 = new Aggr[]({ 1, 2, 3 }); |
| Aggr *a8 = new Aggr[]({ 1 }, { 6, 7 }); |
| #endif |
| |
| int |
| main () |
| { |
| if (p1[0] != 1 || p2[0] != 1 || p2[1] != 2 || p2[2] != 3) |
| __builtin_abort (); |
| if (__builtin_strcmp (c1, "foo")) |
| __builtin_abort (); |
| if (a2->a != 1 || a2->b != 2 || a2->c != 3) |
| __builtin_abort (); |
| if (a3[0].a != 1 || a3[0].b != 2 || a3[0].c != 3 |
| || a3[1].a != 4 || a3[1].b != 0 || a3[1].c != 0) |
| __builtin_abort (); |
| if (a4->a != 1 || a4->b != 2 || a4->c != 3) |
| __builtin_abort (); |
| if (a5[0].a != 1 || a5[0].b != 0 || a5[0].c != 0 |
| || a5[1].a != 6 || a5[1].b != 7 || a5[1].c != 0) |
| __builtin_abort (); |
| #if __cpp_designated_initializers |
| if (a9->a != 1 || a9->b != 2 || a9->c != 3) |
| __builtin_abort (); |
| #endif |
| #if __cpp_aggregate_paren_init |
| if (q1[0] != 1) |
| __builtin_abort (); |
| if (q2[0] != 1 || q2[1] != 2 || q2[2] != 3) |
| __builtin_abort (); |
| if (__builtin_strcmp (d1, "foo") || __builtin_strcmp (d2, "foo") |
| || __builtin_strcmp (d3, "foo")) |
| __builtin_abort (); |
| if (a7[0].a != 1 || a7[0].b != 2 || a7[0].c != 3) |
| __builtin_abort (); |
| if (a8[0].a != 1 || a8[0].b != 0 || a8[0].c != 0 |
| || a8[1].a != 6 || a8[1].b != 7 || a8[1].c != 0) |
| __builtin_abort (); |
| #endif |
| } |