Daily bump.
[gcc.git] / gcc / testsuite / g++.dg / warn / Wmismatched-new-delete-3.C
blob25e13461fe760d710cadd10ff2cf1005485f8475
1 /* PR c++/98305 spurious -Wmismatched-new-delete on template instance
2    { dg-do compile }
3    { dg-options "-Wall" } */
5 typedef __SIZE_TYPE__ size_t;
7 void sink (void*, ...);
9 template <class>
10 struct A1
12   A1 ();
14   void* operator new (size_t);
15   void operator delete (void*);
17   void* operator new[] (size_t);
18   void operator delete[] (void*);
20   template <class, class>
21   struct A2
22   {
23     A2 ();
25     void* operator new (size_t);
26     void operator delete (void*);
28     void* operator new[] (size_t);
29     void operator delete[] (void*);
30   };
33 void test_a1 ()
35   {
36     A1<int> *p = new A1<int>();
37     sink (p);
38     delete p;
39   }
41   {
42     A1<long> *p = new A1<long>();
43     sink (p);
44     delete p;
45   }
47   {
48     void *p = new A1<int>();
49     A1<long> *q = (A1<long>*)p;
50     sink (q);
51     delete q;       // { dg-warning "-Wmismatched-new-delete" }
52   }
55 void test_a2 ()
57   {
58     A1<int>::A2<int, int> *p = new A1<int>::A2<int, int>();
59     sink (p);
60     delete p;
61   }
62   {
63     A1<void>::A2<int, long> *p = new A1<void>::A2<int, long>();
64     sink (p);
65     delete p;
66   }
67   {
68     A1<char*>::A2<long, double> *p = new A1<char*>::A2<long, double>();
69     sink (p);
70     delete p;
71   }
73   typedef A1<char>::A2<char, char> A;
74   {
75     A *p = (A*)new A1<char>::A2<char, int>();
76     sink (p);
77     delete p;       // { dg-warning "-Wmismatched-new-delete" }
78   }
80   {
81     A *p = (A*)new A1<char>::A2<int, char>();
82     sink (p);
83     delete p;       // { dg-warning "-Wmismatched-new-delete" }
84   }
86   {
87     A *p = (A*)new A1<int>::A2<char, char>();
88     sink (p);
89     delete p;       // { dg-warning "-Wmismatched-new-delete" }
90   }
94 template <class>
95 struct B1
97   B1 ();
99   void* operator new (size_t);
100   void operator delete (void*);
102   void* operator new[] (size_t);
103   void operator delete[] (void*);
105   template <class, class>
106   struct B2
107   {
108     B2 ();
110     void* operator new (size_t);
111     void operator delete (void*);
113     void* operator new[] (size_t);
114     void operator delete[] (void*);
115   };
119 void test_b_b ()
121   typedef B1<char> B1c;
122   typedef B1c::B2<B1c, B1c> B1cB2B1c;
124   {
125     B1cB2B1c *p = new B1cB2B1c;
126     sink (p);
127     delete p;
128   }
130   {
131     B1cB2B1c *p = new B1cB2B1c[1];
132     sink (p);
133     delete[] p;
134   }
138 void test_a_b ()
140   typedef B1<char>::B2<char, char> B;
142   {
143     B *p = (B*)new A1<char>::A2<char, int>[1];
144     sink (p);
145     delete[] p;     // { dg-warning "-Wmismatched-new-delete" }
146   }
148   {
149     B *p = (B*)new A1<char>::A2<int, char>[2];
150     sink (p);
151     delete[] p;     // { dg-warning "-Wmismatched-new-delete" }
152   }
154   {
155     B *p = (B*)new A1<int>::A2<char, char>[3];
156     sink (p);
157     delete[] p;     // { dg-warning "-Wmismatched-new-delete" }
158   }