8 int *p = new(buf) int (42);
11 /* Placement new[]. */
15 char buf[sizeof(int) * 10];
16 int *p = new(buf) int[10];
17 } // { dg-prune-output "-Wfree-nonheap-object" }
19 /* Delete of placement new. */
23 char buf[sizeof(int)]; // { dg-message "region created on stack here" }
24 int *p = new (buf) int (42);
25 delete p; // { dg-warning "memory on the stack" }
28 // { dg-prune-output "-Wfree-nonheap-object" }
32 int buf[5]; // { dg-message "region created on stack here" }
33 int *p = new (&buf[2]) int (42);
34 delete p; // { dg-warning "memory on the stack" }
38 // { dg-prune-output "-Wfree-nonheap-object" }
40 void test_write_placement_after_delete (void)
42 short *s = ::new short;
43 short *lp = ::new (s) short;
45 *lp = 12; /* { dg-warning "use after 'delete' of 'lp'" "write placement new after buffer deletion" } */
48 void test_read_placement_after_delete (void)
50 short *s = ::new short;
51 short *lp = ::new (s) short;
53 short m = *lp; // { dg-warning "use after 'delete' of 'lp'" "read placement new after buffer deletion" }
62 void test_use_placement_after_destruction (void)
65 int *lp = ::new (&a.y) int;
66 *lp = 2; /* { dg-bogus "-Wanalyzer-use-of-uninitialized-value" } */
68 int m = *lp; /* { dg-warning "use of uninitialized value '\\*lp'" "use of placement after the underlying buffer was destructed." } */
71 void test_initialization_through_placement (void)
74 int *p = ::new (&x) int;
76 int z = x + 2; /* { dg-bogus "use of uninitialized value 'x'" "x has been initialized through placement pointer" } */
79 void test_partial_initialization_through_placement (void)
82 char *p = ::new (&buf[2]) char;
84 char *y = ::new (&buf[0]) char;
85 char z = buf[2] + 2; /* { dg-bogus "use of uninitialized value" } */
86 z = *y + 2; /* { dg-warning "use of uninitialized value '\\*y'" "y has only been partially initialized" } */
90 void test_delete_placement (void)
92 A *a = ::new A; /* { dg-bogus "use of possibly-NULL 'operator new(8)' where non-null expected" "throwing new cannot be null" } */
93 int *z = ::new (&a->y) int;
94 a->~A(); // deconstruct properly
95 ::operator delete (a);
96 ::operator delete (z); /* { dg-warning "use after 'delete' of 'z'" } */
99 void test_delete_placement_2 (void)
101 A *a = ::new A; /* { dg-bogus "use of possibly-NULL 'operator new(8)' where non-null expected" "throwing new cannot be null" } */
102 int *z = ::new (&a->y) int;
104 ::operator delete (z); /* { dg-warning "use after 'delete' of 'z'" } */
107 void test_use_placement_after_deallocation (void)
110 int *lp = ::new (&a->y) int;
111 *lp = 2; /* { dg-bogus "use of uninitialized value" } */
112 ::operator delete (a);
113 int m = *lp; /* { dg-warning "use after 'delete' of 'lp'" "use of placement after the underlying buffer was deallocated." } */