Fortran: Fix PR 47485.
[gcc.git] / gcc / testsuite / g++.dg / analyzer / placement-new.C
blobc10222bf2a94e8544349b4599536ab645863797c
1 #include <new>
3 /* Placement new.  */
5 void test_1 (void)
7   char buf[sizeof(int)];
8   int *p = new(buf) int (42);
11 /* Placement new[].  */
13 void test_2 (void)
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.  */
21 void test_3 (void)
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" }
30 void test_4 (void)
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;
44   ::delete s;
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;
52   ::delete s;
53   short m = *lp; // { dg-warning "use after 'delete' of 'lp'" "read placement new after buffer deletion" }
56 struct A
58   int x;
59   int y;
62 void test_use_placement_after_destruction (void)
64   A a;
65   int *lp = ::new (&a.y) int;
66   *lp = 2; /* { dg-bogus "-Wanalyzer-use-of-uninitialized-value" } */
67   a.~A();
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)
73   int x;
74   int *p = ::new (&x) int;
75   *p = 10;
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)
81   char buf[4];
82   char *p = ::new (&buf[2]) char;
83   *p = 10;
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;
103   delete a;
104   ::operator delete (z); /* { dg-warning "use after 'delete' of 'z'" }  */
107 void test_use_placement_after_deallocation (void)
109   A *a = ::new A ();
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." } */