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