new-delete.cpp revision 5d64e5b6bc03462e8b7d0cd804565829afb1b508
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// RUN: clang-cc -fsyntax-only -verify %s
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stddef.h>
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct S // expected-note {{candidate}}
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S(int, int, double); // expected-note {{candidate}}
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S(double, int); // expected-note 2 {{candidate}}
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S(float, int); // expected-note 2 {{candidate}}
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct T; // expected-note{{forward declaration of 'struct T'}}
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct U
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // A special new, to verify that the global version isn't used.
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void* operator new(size_t, S*); // expected-note {{candidate}}
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct V : U
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(size_t); // expected-note 2 {{candidate}}
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(size_t, int*); // expected-note 3 {{candidate}}
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(size_t, float*); // expected-note 3 {{candidate}}
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(size_t, S); // expected-note 2 {{candidate}}
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid good_news()
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  int *pi = new int;
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  float *pf = new (pi) float();
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = new int(1);
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = new int('c');
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const int *pci = new const int();
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S *ps = new S(1, 2, 3.4);
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ps = new (pf) (S)(1, 2, 3.4);
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S *(*paps)[2] = new S*[*pi][2];
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ps = new (S[3])(1, 2, 3.4);
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  typedef int ia4[4];
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ia4 *pai = new (int[3][4]);
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = ::new int;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  U *pu = new (ps) U;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  V *pv = new (ps) V;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = new (S(1.0f, 2)) int;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[true];
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct abstract {
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual ~abstract() = 0;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid bad_news(int *ip)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  int i = 1;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new; // expected-error {{missing type specifier}}
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new 4; // expected-error {{missing type specifier}}
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new () int; // expected-error {{expected expression}}
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}}
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[1][i]; // expected-error {{only the first dimension}}
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (int[1][i]); // expected-error {{only the first dimension}}
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int(*(S*)0); // expected-error {{incompatible type initializing}}
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int(1, 2); // expected-error {{initializer of a builtin type can only take one argument}}
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new S(1); // expected-error {{no matching constructor}}
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}}
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new const int; // expected-error {{must provide an initializer}}
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new float*(ip); // expected-error {{incompatible type initializing 'int *', expected 'float *'}}
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // Undefined, but clang should reject it directly.
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[-1]; // expected-error {{array size is negative}}
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumerated type, not 'struct S'}}
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)::S::new int; // expected-error {{expected unqualified-id}}
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}}
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // This must fail, because the member version shouldn't be found.
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // This must fail, because any member version hides all global versions.
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new U; // expected-error {{no matching function for call to 'operator new'}}
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (int[]); // expected-error {{array size must be specified in new expressions}}
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}}
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // Some lacking cases due to lack of sema support.
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid good_deletes()
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (int*)0;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete [](int*)0;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (S*)0;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ::delete (int*)0;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid bad_deletes()
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete 0; // expected-error {{cannot delete expression of type 'int'}}
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete [0] (int*)0; // expected-error {{expected ']'}} \
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      // expected-note {{to match this '['}}
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (void*)0; // expected-error {{cannot delete expression}}
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (T*)0; // expected-warning {{deleting pointer to incomplete type}}
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ::S::delete (int*)0; // expected-error {{expected unqualified-id}}
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct X0 { };
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct X1 {
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  operator int*();
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  operator float();
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct X2 {
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  operator int*(); // expected-note {{candidate function}}
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  operator float*(); // expected-note {{candidate function}}
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid test_delete_conv(X0 x0, X1 x1, X2 x2) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete x0; // expected-error{{cannot delete}}
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete x1;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete x2; // expected-error{{ambiguous conversion of delete expression of type 'struct X2' to a pointer}}
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PR4782
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass X3 {
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  static void operator delete(void * mem, unsigned long size);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass X4 {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  static void release(X3 *x);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  static void operator delete(void * mem, unsigned long size);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid X4::release(X3 *x) {
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete x;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass X5 {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void Destroy() const { delete this; }
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org