1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null 2c83ed049af2a2ed7ab94b8206fc0fec4da7e26dbDouglas Gregor 3b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl#include <stddef.h> 4b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl 54c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlstruct S // expected-note {{candidate}} 64c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl{ 74c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl S(int, int, double); // expected-note {{candidate}} 83cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redl S(double, int); // expected-note 2 {{candidate}} 93cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redl S(float, int); // expected-note 2 {{candidate}} 104c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}; 117c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct T; // expected-note{{forward declaration of 'T'}} 12636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redlstruct U 13636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl{ 14636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl // A special new, to verify that the global version isn't used. 159afe1308ed19dffc281dca5cfbe521826754980fSebastian Redl void* operator new(size_t, S*); // expected-note {{candidate}} 16636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl}; 177f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redlstruct V : U 187f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl{ 197f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl}; 204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 21cf19e5bad3efe2c7efa886e984988ea21825c45dRichard Smithinline void operator delete(void *); // expected-warning {{replacement function 'operator delete' cannot be declared 'inline'}} 22cf19e5bad3efe2c7efa886e984988ea21825c45dRichard Smith 23cf19e5bad3efe2c7efa886e984988ea21825c45dRichard Smith__attribute__((used)) 24cf19e5bad3efe2c7efa886e984988ea21825c45dRichard Smithinline void *operator new(size_t) { // no warning, due to __attribute__((used)) 25cf19e5bad3efe2c7efa886e984988ea21825c45dRichard Smith return 0; 26cf19e5bad3efe2c7efa886e984988ea21825c45dRichard Smith} 27cf19e5bad3efe2c7efa886e984988ea21825c45dRichard Smith 286e790ab61bf4835944971955e84279112833ef0cDouglas Gregor// PR5823 296e790ab61bf4835944971955e84279112833ef0cDouglas Gregorvoid* operator new(const size_t); // expected-note 2 {{candidate}} 303cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redlvoid* operator new(size_t, int*); // expected-note 3 {{candidate}} 313cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redlvoid* operator new(size_t, float*); // expected-note 3 {{candidate}} 32fc27d268cb34cbb8d186c6ad7cc043d41581ce71Anders Carlssonvoid* operator new(size_t, S); // expected-note 2 {{candidate}} 33b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl 343caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregorstruct foo { }; 353caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor 364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid good_news() 374c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl{ 384c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl int *pi = new int; 394c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl float *pf = new (pi) float(); 404c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl pi = new int(1); 414c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl pi = new int('c'); 424c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const int *pci = new const int(); 434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl S *ps = new S(1, 2, 3.4); 44cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl ps = new (pf) (S)(1, 2, 3.4); 454c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl S *(*paps)[2] = new S*[*pi][2]; 464c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl typedef int ia4[4]; 474c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl ia4 *pai = new (int[3][4]); 48fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl pi = ::new int; 49636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl U *pu = new (ps) U; 505d64e5b6bc03462e8b7d0cd804565829afb1b508Douglas Gregor V *pv = new (ps) V; 51fc27d268cb34cbb8d186c6ad7cc043d41581ce71Anders Carlsson 52fc27d268cb34cbb8d186c6ad7cc043d41581ce71Anders Carlsson pi = new (S(1.0f, 2)) int; 53ac18b2e3af8d0c5304f74e362a1d4207363e4c94Anders Carlsson 54ac18b2e3af8d0c5304f74e362a1d4207363e4c94Anders Carlsson (void)new int[true]; 553caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor 563caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor // PR7147 573caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor typedef int a[2]; 583caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor foo* f1 = new foo; 593caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor foo* f2 = new foo[2]; 603caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor typedef foo x[2]; 613caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor typedef foo y[2][2]; 623caf04ea0c01ff6822209c4621c3fa64a48029a4Douglas Gregor x* f3 = new y; 634c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 65e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregorstruct abstract { 66e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor virtual ~abstract() = 0; 67e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor}; 68e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 69c83ed049af2a2ed7ab94b8206fc0fec4da7e26dbDouglas Gregorvoid bad_news(int *ip) 704c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl{ 71282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith int i = 1; // expected-note 2{{here}} 729fa8e569407e02148888136609431a3fe083096dNick Lewycky (void)new; // expected-error {{expected a type}} 739fa8e569407e02148888136609431a3fe083096dNick Lewycky (void)new 4; // expected-error {{expected a type}} 744c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl (void)new () int; // expected-error {{expected expression}} 75f39aec17b89f8f0dd78e78c50ad2fa08f12272e3Richard Smith (void)new int[1.1]; // expected-error {{array size expression must have integral or enumeration type, not 'double'}} 76282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith (void)new int[1][i]; // expected-error {{only the first dimension}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}} 77282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith (void)new (int[1][i]); // expected-error {{only the first dimension}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}} 784bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor (void)new (int[i]); // expected-warning {{when type is in parentheses}} 797c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)new int(*(S*)0); // expected-error {{no viable conversion from 'S' to 'int'}} 8099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}} 814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl (void)new S(1); // expected-error {{no matching constructor}} 827c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}} 8358f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattner (void)new const int; // expected-error {{default initialization of an object of const type 'const int'}} 84a729bbb739ca97a8dc52b6b0495725590a0367dcAnders Carlsson (void)new float*(ip); // expected-error {{cannot initialize a new value of type 'float *' with an lvalue of type 'int *'}} 85cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl // Undefined, but clang should reject it directly. 86cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl (void)new int[-1]; // expected-error {{array size is negative}} 870b458fd8b6321c11e8b22727e0e9b9960e93ff4dRichard Smith (void)new int[2000000000]; // expected-error {{array is too large}} 88f39aec17b89f8f0dd78e78c50ad2fa08f12272e3Richard Smith (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumeration type, not 'S'}} 89fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl (void)::S::new int; // expected-error {{expected unqualified-id}} 90b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}} 917f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}} 92636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl // This must fail, because the member version shouldn't be found. 93636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}} 949afe1308ed19dffc281dca5cfbe521826754980fSebastian Redl // This must fail, because any member version hides all global versions. 959afe1308ed19dffc281dca5cfbe521826754980fSebastian Redl (void)new U; // expected-error {{no matching function for call to 'operator new'}} 9600e68e2cc5ce37cb95beb801cae73c0d1e9dda37Sebastian Redl (void)new (int[]); // expected-error {{array size must be specified in new expressions}} 9700e68e2cc5ce37cb95beb801cae73c0d1e9dda37Sebastian Redl (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}} 984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Some lacking cases due to lack of sema support. 994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 1004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1014c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid good_deletes() 1024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl{ 1034c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl delete (int*)0; 1044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl delete [](int*)0; 1054c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl delete (S*)0; 106fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl ::delete (int*)0; 1074c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 1084c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1094c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid bad_deletes() 1104c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl{ 1114c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl delete 0; // expected-error {{cannot delete expression of type 'int'}} 1126ee326af4e77e6f05973486097884d7431f2108dRichard Smith delete [0] (int*)0; // expected-error {{expected expression}} 11394a615718d06704816c6e31a811f823c05e39f52Douglas Gregor delete (void*)0; // expected-warning {{cannot delete expression with pointer-to-'void' type 'void *'}} 1144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl delete (T*)0; // expected-warning {{deleting pointer to incomplete type}} 115fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl ::S::delete (int*)0; // expected-error {{expected unqualified-id}} 1164c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 1179cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor 1189cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregorstruct X0 { }; 1199cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor 1209cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregorstruct X1 { 1219cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor operator int*(); 1229cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor operator float(); 1239cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor}; 1249cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor 1259cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregorstruct X2 { 126097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator int*(); // expected-note {{conversion}} 127097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator float*(); // expected-note {{conversion}} 1289cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor}; 1299cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor 1309cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregorvoid test_delete_conv(X0 x0, X1 x1, X2 x2) { 1319cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor delete x0; // expected-error{{cannot delete}} 1329cd9f3f55d22f34f1d69db8bfc2735c4e1e082c3Douglas Gregor delete x1; 1337c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall delete x2; // expected-error{{ambiguous conversion of delete expression of type 'X2' to a pointer}} 134f652793d4d32cc71b5ee2167069cbd363baa75deFariborz Jahanian} 1359091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 1369091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor// PR4782 1379091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregorclass X3 { 1389091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregorpublic: 1395e6214b4c7b326a83fbcf55250a95b46bdc0bb8fEli Friedman static void operator delete(void * mem, size_t size); 1409091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor}; 1419091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 1429091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregorclass X4 { 1439091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregorpublic: 1449091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor static void release(X3 *x); 1455e6214b4c7b326a83fbcf55250a95b46bdc0bb8fEli Friedman static void operator delete(void * mem, size_t size); 1469091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor}; 1479091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 1489091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 1499091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregorvoid X4::release(X3 *x) { 1509091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor delete x; 1519091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor} 1521070c9f7acc889336be6f80c70dc1b32622cc83dDouglas Gregor 1535d64e5b6bc03462e8b7d0cd804565829afb1b508Douglas Gregorclass X5 { 1541070c9f7acc889336be6f80c70dc1b32622cc83dDouglas Gregorpublic: 1551070c9f7acc889336be6f80c70dc1b32622cc83dDouglas Gregor void Destroy() const { delete this; } 1561070c9f7acc889336be6f80c70dc1b32622cc83dDouglas Gregor}; 157b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian 158b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanianclass Base { 159b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanianpublic: 160156c78e4ef14e5f7ba251554ea8f2dbec573fef3Anders Carlsson static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}} 161156c78e4ef14e5f7ba251554ea8f2dbec573fef3Anders Carlsson static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}} 162b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian}; 163b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian 164b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanianclass Tier {}; 165b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanianclass Comp : public Tier {}; 166b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian 167b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanianclass Thai : public Base { 168b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanianpublic: 169b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian Thai(const Tier *adoptDictionary); 170b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian}; 171b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian 172b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanianvoid loadEngineFor() { 173b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian const Comp *dict; 174b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian new Thai(dict); 175b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian} 176b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian 177b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahaniantemplate <class T> struct TBase { 1782fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}} 179b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian}; 180b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian 1812fa98001f832836e3f652c211a9d2f80501d659aDouglas GregorTBase<int> t1; 182b03bfa55d03ca38922ffedac19225d0832e8d911Fariborz Jahanian 1830ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlssonclass X6 { 1840ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlssonpublic: 1850ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 1860ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson}; 1870ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson 1880ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlssonclass X7 { 1890ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlssonpublic: 1900ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 1910ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson}; 1920ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson 1930ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlssonclass X8 : public X6, public X7 { 1940ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson}; 1950ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson 19650724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlssonvoid f(X8 *x8) { 1970ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}} 1980ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson} 1990ba63ea5be2c90ef62d1350ea4a0a0c415a785f1Anders Carlsson 20050724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlssonclass X9 { 2017002f4c03c2d0544f4e8bea8d3a5636519081e35John McCallpublic: 20250724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlsson static void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 20350724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlsson static void operator delete(void*, float); // expected-note {{'operator delete' declared here}} 20450724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlsson}; 20550724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlsson 20650724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlssonvoid f(X9 *x9) { 20750724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlsson delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}} 20850724302e24d44a27e3bc45e7185a710d6eb3c2dAnders Carlsson} 20937909808416da93703cecc83091e2b9eab0053d6Anders Carlsson 21037909808416da93703cecc83091e2b9eab0053d6Anders Carlssonstruct X10 { 21137909808416da93703cecc83091e2b9eab0053d6Anders Carlsson virtual ~X10(); 21237909808416da93703cecc83091e2b9eab0053d6Anders Carlsson}; 21337909808416da93703cecc83091e2b9eab0053d6Anders Carlsson 21437909808416da93703cecc83091e2b9eab0053d6Anders Carlssonstruct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}} 21537909808416da93703cecc83091e2b9eab0053d6Anders Carlsson void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 21637909808416da93703cecc83091e2b9eab0053d6Anders Carlsson}; 21737909808416da93703cecc83091e2b9eab0053d6Anders Carlsson 21837909808416da93703cecc83091e2b9eab0053d6Anders Carlssonvoid f() { 2196698be8a6930730df5e61c941197e72682196187Richard Smith X11 x11; // expected-note {{implicit destructor for 'X11' first required here}} 22037909808416da93703cecc83091e2b9eab0053d6Anders Carlsson} 221eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson 222eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlssonstruct X12 { 223eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson void* operator new(size_t, void*); 224eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson}; 225eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson 226eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlssonstruct X13 : X12 { 227eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson using X12::operator new; 228eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson}; 229eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson 230eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlssonstatic void* f(void* g) 231eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson{ 232eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson return new (g) X13(); 233eac813909b3ca1142ad186f6c6a1b1ae0dbf9378Anders Carlsson} 2344a73ea9c4e87aa111901f3c27b08f0571b58a4cfChandler Carruth 235e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruthclass X14 { 2367002f4c03c2d0544f4e8bea8d3a5636519081e35John McCallpublic: 237e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth static void operator delete(void*, const size_t); 238e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth}; 239e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth 240e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruthvoid f(X14 *x14a, X14 *x14b) { 241e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth delete x14a; 242e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth} 243e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth 244d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregorclass X15 { 245d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregorprivate: 246d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor X15(); // expected-note {{declared private here}} 247d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor ~X15(); // expected-note {{declared private here}} 248d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor}; 249d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor 250d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregorvoid f(X15* x) { 251d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor new X15(); // expected-error {{calling a private constructor}} 252d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor delete x; // expected-error {{calling a private destructor}} 253d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor} 254d880f52be3e4a8ccad92ac31932eeae5e0870a93Douglas Gregor 2554a73ea9c4e87aa111901f3c27b08f0571b58a4cfChandler Carruthnamespace PR5918 { // Look for template operator new overloads. 2564a73ea9c4e87aa111901f3c27b08f0571b58a4cfChandler Carruth struct S { template<typename T> static void* operator new(size_t, T); }; 2574a73ea9c4e87aa111901f3c27b08f0571b58a4cfChandler Carruth void test() { 2584a73ea9c4e87aa111901f3c27b08f0571b58a4cfChandler Carruth (void)new(0) S; 2594a73ea9c4e87aa111901f3c27b08f0571b58a4cfChandler Carruth } 2604a73ea9c4e87aa111901f3c27b08f0571b58a4cfChandler Carruth} 26148c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson 26248c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssonnamespace Test1 { 26348c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson 26448c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssonvoid f() { 26548c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson (void)new int[10](1, 2); // expected-error {{array 'new' cannot have initialization arguments}} 26655cbd6e51fdca832c31bf8c179c40978a5d1f892Anders Carlsson 26755cbd6e51fdca832c31bf8c179c40978a5d1f892Anders Carlsson typedef int T[10]; 26855cbd6e51fdca832c31bf8c179c40978a5d1f892Anders Carlsson (void)new T(1, 2); // expected-error {{array 'new' cannot have initialization arguments}} 26948c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson} 27048c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson 27148c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssontemplate<typename T> 27248c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssonvoid g(unsigned i) { 27348c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson (void)new T[1](i); // expected-error {{array 'new' cannot have initialization arguments}} 27448c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson} 27548c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson 27648c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssontemplate<typename T> 27748c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssonvoid h(unsigned i) { 27848c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson (void)new T(i); // expected-error {{array 'new' cannot have initialization arguments}} 27948c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson} 28048c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssontemplate void h<unsigned>(unsigned); 28148c950137e4318abb1080f438208fda8c14ca8b9Anders Carlssontemplate void h<unsigned[10]>(unsigned); // expected-note {{in instantiation of function template specialization 'Test1::h<unsigned int [10]>' requested here}} 28248c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson 28348c950137e4318abb1080f438208fda8c14ca8b9Anders Carlsson} 2842389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth 2852389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth// Don't diagnose access for overload candidates that aren't selected. 2862389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruthnamespace PR7436 { 2872389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruthstruct S1 { 2882389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth void* operator new(size_t); 2892389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth void operator delete(void* p); 2902389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth 2912389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruthprivate: 2922389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth void* operator new(size_t, void*); // expected-note {{declared private here}} 2932389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth void operator delete(void*, void*); 2942389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth}; 2952389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruthclass S2 { 2962389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth void* operator new(size_t); // expected-note {{declared private here}} 2972389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth void operator delete(void* p); // expected-note {{declared private here}} 2982389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth}; 2992389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth 3002389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruthvoid test(S1* s1, S2* s2) { 3012389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth delete s1; 3022389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth delete s2; // expected-error {{is a private member}} 3032389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth (void)new S1(); 3042389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth (void)new (0L) S1(); // expected-error {{is a private member}} 3052389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth (void)new S2(); // expected-error {{is a private member}} 3062389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth} 3072389324eb73a1c99d5dfc1dc9eed047ddc96a7b4Chandler Carruth} 3086bc574daab3d3571d888cc4a21df67f2e2a14792Douglas Gregor 3094bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregornamespace rdar8018245 { 3104bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor struct X0 { 3114bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor static const int value = 17; 3124bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor }; 3134bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 3144bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor const int X0::value; 3154bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 3164bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor struct X1 { 3174bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor static int value; 3184bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor }; 3194bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 3204bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor int X1::value; 3214bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 3224bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor template<typename T> 3234bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor int *f() { 3244bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor return new (int[T::value]); // expected-warning{{when type is in parentheses, array cannot have dynamic size}} 3254bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor } 3264bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 3274bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor template int *f<X0>(); 3284bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor template int *f<X1>(); // expected-note{{in instantiation of}} 3294bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 3304bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor} 331254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor 332254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor// <rdar://problem/8248780> 333254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregornamespace Instantiate { 334254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor template<typename T> struct X { 335254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor operator T*(); 336254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor }; 337254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor 338254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor void f(X<int> &xi) { 339254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor delete xi; 340254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor } 341254a9427ff84d694724fdecd0642dad8ceaa0645Douglas Gregor} 34258e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl 34358e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redlnamespace PR7810 { 34458e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl struct X { 34558e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl // cv is ignored in arguments 34658e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl static void operator delete(void *const); 34758e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl }; 34858e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl struct Y { 34958e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl // cv is ignored in arguments 35058e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl static void operator delete(void *volatile); 35158e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl }; 35258e5539df7d9d1f003912fccb8d524d4f2c6846aSebastian Redl} 35309556fd1fb576144e2beda023bf3386f2292243bChandler Carruth 35409556fd1fb576144e2beda023bf3386f2292243bChandler Carruth// Don't crash on template delete operators 35509556fd1fb576144e2beda023bf3386f2292243bChandler Carruthnamespace TemplateDestructors { 35609556fd1fb576144e2beda023bf3386f2292243bChandler Carruth struct S { 35709556fd1fb576144e2beda023bf3386f2292243bChandler Carruth virtual ~S() {} 35809556fd1fb576144e2beda023bf3386f2292243bChandler Carruth 35909556fd1fb576144e2beda023bf3386f2292243bChandler Carruth void* operator new(const size_t size); 36009556fd1fb576144e2beda023bf3386f2292243bChandler Carruth template<class T> void* operator new(const size_t, const int, T*); 36109556fd1fb576144e2beda023bf3386f2292243bChandler Carruth void operator delete(void*, const size_t); 36209556fd1fb576144e2beda023bf3386f2292243bChandler Carruth template<class T> void operator delete(void*, const size_t, const int, T*); 36309556fd1fb576144e2beda023bf3386f2292243bChandler Carruth }; 36409556fd1fb576144e2beda023bf3386f2292243bChandler Carruth} 365520441eb82202702688750860fd98148421ea0edDouglas Gregor 366520441eb82202702688750860fd98148421ea0edDouglas Gregornamespace DeleteParam { 367520441eb82202702688750860fd98148421ea0edDouglas Gregor struct X { 368520441eb82202702688750860fd98148421ea0edDouglas Gregor void operator delete(X*); // expected-error{{first parameter of 'operator delete' must have type 'void *'}} 369520441eb82202702688750860fd98148421ea0edDouglas Gregor }; 370520441eb82202702688750860fd98148421ea0edDouglas Gregor 371520441eb82202702688750860fd98148421ea0edDouglas Gregor struct Y { 372520441eb82202702688750860fd98148421ea0edDouglas Gregor void operator delete(void* const); 373520441eb82202702688750860fd98148421ea0edDouglas Gregor }; 374520441eb82202702688750860fd98148421ea0edDouglas Gregor} 375edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall 376edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall// <rdar://problem/8427878> 377edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall// Test that the correct 'operator delete' is selected to pair with 378edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall// the unexpected placement 'operator new'. 379edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCallnamespace PairedDelete { 380edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall template <class T> struct A { 381edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall A(); 382edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall void *operator new(size_t s, double d = 0); 383edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall void operator delete(void *p, double d); 384edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall void operator delete(void *p) { 385edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall T::dealloc(p); 386edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall } 387edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall }; 388edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall 389edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall A<int> *test() { 390edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall return new A<int>(); 391edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall } 392edeb6c9b47e802da1a9a149ea1ea4f1ddd7f6182John McCall} 3939fa8e569407e02148888136609431a3fe083096dNick Lewycky 3949fa8e569407e02148888136609431a3fe083096dNick Lewyckynamespace PR7702 { 3959fa8e569407e02148888136609431a3fe083096dNick Lewycky void test1() { 39669730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith new DoesNotExist; // expected-error {{unknown type name 'DoesNotExist'}} 3979fa8e569407e02148888136609431a3fe083096dNick Lewycky } 3989fa8e569407e02148888136609431a3fe083096dNick Lewycky} 39984ff0fccb180098b70504c03c3072a19e6d573afJohn McCall 40084ff0fccb180098b70504c03c3072a19e6d573afJohn McCallnamespace ArrayNewNeedsDtor { 40184ff0fccb180098b70504c03c3072a19e6d573afJohn McCall struct A { A(); private: ~A(); }; // expected-note {{declared private here}} 40284ff0fccb180098b70504c03c3072a19e6d573afJohn McCall struct B { B(); A a; }; // expected-error {{field of type 'ArrayNewNeedsDtor::A' has private destructor}} 40384ff0fccb180098b70504c03c3072a19e6d573afJohn McCall B *test9() { 4046698be8a6930730df5e61c941197e72682196187Richard Smith return new B[5]; // expected-note {{implicit destructor for 'ArrayNewNeedsDtor::B' first required here}} 40584ff0fccb180098b70504c03c3072a19e6d573afJohn McCall } 40684ff0fccb180098b70504c03c3072a19e6d573afJohn McCall} 407e52c91478a144f913019591ee1839e1846345f71Eli Friedman 408e52c91478a144f913019591ee1839e1846345f71Eli Friedmannamespace DeleteIncompleteClass { 409e52c91478a144f913019591ee1839e1846345f71Eli Friedman struct A; // expected-note {{forward declaration}} 410e52c91478a144f913019591ee1839e1846345f71Eli Friedman extern A x; 411e52c91478a144f913019591ee1839e1846345f71Eli Friedman void f() { delete x; } // expected-error {{deleting incomplete class type}} 412e52c91478a144f913019591ee1839e1846345f71Eli Friedman} 413e52c91478a144f913019591ee1839e1846345f71Eli Friedman 414e52c91478a144f913019591ee1839e1846345f71Eli Friedmannamespace DeleteIncompleteClassPointerError { 415e52c91478a144f913019591ee1839e1846345f71Eli Friedman struct A; // expected-note {{forward declaration}} 416e52c91478a144f913019591ee1839e1846345f71Eli Friedman void f(A *x) { 1+delete x; } // expected-warning {{deleting pointer to incomplete type}} \ 417e52c91478a144f913019591ee1839e1846345f71Eli Friedman // expected-error {{invalid operands to binary expression}} 418e52c91478a144f913019591ee1839e1846345f71Eli Friedman} 419e33f643230738400f0bf5503a87d886e9bc635deEli Friedman 420e33f643230738400f0bf5503a87d886e9bc635deEli Friedmannamespace PR10504 { 421e33f643230738400f0bf5503a87d886e9bc635deEli Friedman struct A { 422e33f643230738400f0bf5503a87d886e9bc635deEli Friedman virtual void foo() = 0; 423e33f643230738400f0bf5503a87d886e9bc635deEli Friedman }; 424ef8c79c52200e4f7c32f8ef2744c1557b7f3f3eaEli Friedman void f(A *x) { delete x; } // expected-warning {{delete called on 'PR10504::A' that is abstract but has non-virtual destructor}} 425e33f643230738400f0bf5503a87d886e9bc635deEli Friedman} 4262aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 4272aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redlstruct PlacementArg {}; 4282aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redlinline void *operator new[](size_t, const PlacementArg &) throw () { 4292aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return 0; 4302aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl} 4312aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redlinline void operator delete[](void *, const PlacementArg &) throw () { 4322aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl} 4332aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 4342aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redlnamespace r150682 { 4352aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 4362aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl template <typename X> 4372aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl struct S { 4382aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl struct Inner {}; 4392aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl S() { new Inner[1]; } 4402aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl }; 4412aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 4422aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl struct T { 4432aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl }; 4442aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 4452aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl template<typename X> 4462aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl void tfn() { 4472aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl new (*(PlacementArg*)0) T[1]; 4482aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl } 4492aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 4502aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl void fn() { 4512aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl tfn<int>(); 4522aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl } 4532aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 4542aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl} 4551f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl 4561f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redlnamespace P12023 { 4571f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl struct CopyCounter 4581f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl { 4591f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl CopyCounter(); 4601f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl CopyCounter(const CopyCounter&); 4611f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl }; 4621f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl 4631f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl int main() 4641f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl { 4651f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl CopyCounter* f = new CopyCounter[10](CopyCounter()); // expected-error {{cannot have initialization arguments}} 4661f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl return 0; 4671f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl } 4681f27805fe4f5463fd5b4d5396affe1ef23320688Sebastian Redl} 469428c620478d513081399798db5550bf0c779f244Sebastian Redl 470428c620478d513081399798db5550bf0c779f244Sebastian Redlnamespace PR12061 { 471428c620478d513081399798db5550bf0c779f244Sebastian Redl template <class C> struct scoped_array { 472428c620478d513081399798db5550bf0c779f244Sebastian Redl scoped_array(C* p = __null); 473428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 474428c620478d513081399798db5550bf0c779f244Sebastian Redl template <class Payload> struct Foo { 475428c620478d513081399798db5550bf0c779f244Sebastian Redl Foo() : a_(new scoped_array<int>[5]) { } 476428c620478d513081399798db5550bf0c779f244Sebastian Redl scoped_array< scoped_array<int> > a_; 477428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 478428c620478d513081399798db5550bf0c779f244Sebastian Redl class Bar {}; 479428c620478d513081399798db5550bf0c779f244Sebastian Redl Foo<Bar> x; 480428c620478d513081399798db5550bf0c779f244Sebastian Redl 481428c620478d513081399798db5550bf0c779f244Sebastian Redl template <class C> struct scoped_array2 { 482428c620478d513081399798db5550bf0c779f244Sebastian Redl scoped_array2(C* p = __null, C* q = __null); 483428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 484428c620478d513081399798db5550bf0c779f244Sebastian Redl template <class Payload> struct Foo2 { 485428c620478d513081399798db5550bf0c779f244Sebastian Redl Foo2() : a_(new scoped_array2<int>[5]) { } 486428c620478d513081399798db5550bf0c779f244Sebastian Redl scoped_array2< scoped_array2<int> > a_; 487428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 488428c620478d513081399798db5550bf0c779f244Sebastian Redl class Bar2 {}; 489428c620478d513081399798db5550bf0c779f244Sebastian Redl Foo2<Bar2> x2; 490428c620478d513081399798db5550bf0c779f244Sebastian Redl 491428c620478d513081399798db5550bf0c779f244Sebastian Redl class MessageLoop { 492428c620478d513081399798db5550bf0c779f244Sebastian Redl public: 493428c620478d513081399798db5550bf0c779f244Sebastian Redl explicit MessageLoop(int type = 0); 494428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 495428c620478d513081399798db5550bf0c779f244Sebastian Redl template <class CookieStoreTestTraits> 496428c620478d513081399798db5550bf0c779f244Sebastian Redl class CookieStoreTest { 497428c620478d513081399798db5550bf0c779f244Sebastian Redl protected: 498428c620478d513081399798db5550bf0c779f244Sebastian Redl CookieStoreTest() { 499428c620478d513081399798db5550bf0c779f244Sebastian Redl new MessageLoop; 500428c620478d513081399798db5550bf0c779f244Sebastian Redl } 501428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 502428c620478d513081399798db5550bf0c779f244Sebastian Redl struct CookieMonsterTestTraits { 503428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 504428c620478d513081399798db5550bf0c779f244Sebastian Redl class DeferredCookieTaskTest : public CookieStoreTest<CookieMonsterTestTraits> 505428c620478d513081399798db5550bf0c779f244Sebastian Redl { 506428c620478d513081399798db5550bf0c779f244Sebastian Redl DeferredCookieTaskTest() {} 507428c620478d513081399798db5550bf0c779f244Sebastian Redl }; 508428c620478d513081399798db5550bf0c779f244Sebastian Redl} 509206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman 510206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedmanclass DeletingPlaceholder { 511206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman int* f() { 512206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman delete f; // expected-error {{reference to non-static member function must be called; did you mean to call it with no arguments?}} 513206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman return 0; 514206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman } 515206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman int* g(int, int) { 516206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman delete g; // expected-error {{reference to non-static member function must be called}} 517206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman return 0; 518206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman } 519206491dcbe1ed01ee8ce86a0ffe272d5d25491d3Eli Friedman}; 520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18544 { 522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines inline void *operator new(size_t); // expected-error {{'operator new' cannot be declared inside a namespace}} 523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 524ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 525ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// PR19968 526ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesinline void* operator new(); // expected-error {{'operator new' must have at least one parameter}} 527