1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 25346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 35346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test1 45346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B { 5097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator char *(); // expected-note {{conversion to pointer type}} 65346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 75346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 85346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D : B { 9097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator int *(); // expected-note {{conversion to pointer type}} 105346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 115346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 125346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f (D d) 135346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{ 147c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall delete d; // expected-error {{ambiguous conversion of delete expression of type 'D' to a pointer}} 155346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian} 165346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 175346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test2 185346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B1 { 195346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian operator int *(); 205346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 215346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 225346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D1 : B1 { 235346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian operator int *(); 245346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 255346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 265346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f1 (D1 d) 275346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{ 285346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian delete d; 295346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian} 305346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 315346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test3 325346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B2 { 33097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator const int *(); // expected-note {{conversion to pointer type}} 345346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 355346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 365346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D2 : B2 { 37097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator int *(); // expected-note {{conversion to pointer type}} 385346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 395346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 405346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f2 (D2 d) 415346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{ 427c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall delete d; // expected-error {{ambiguous conversion of delete expression of type 'D2' to a pointer}} 435346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian} 445346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 455346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test4 465346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B3 { 47097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator const int *(); // expected-note {{conversion to pointer type}} 485346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 495346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 505346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct A3 { 51097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator const int *(); // expected-note {{conversion to pointer type}} 525346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 535346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 545346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D3 : A3, B3 { 555346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 565346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 575346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f3 (D3 d) 585346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{ 597c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall delete d; // expected-error {{ambiguous conversion of delete expression of type 'D3' to a pointer}} 605346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian} 615346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 625346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test5 635346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct X { 645346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian operator int(); 655346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian operator int*(); 665346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 675346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 685346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f4(X x) { delete x; delete x; } 695346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 705346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test6 715346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct X1 { 725346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian operator int(); 735346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian operator int*(); 745346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian template<typename T> operator T*() const; // converts to any pointer! 755346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}; 765346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 77d7c3e4e9d72a4080664f10c1a1e6160e0de8be76Fariborz Jahanianvoid f5(X1 x) { delete x; } // OK. In selecting a conversion to pointer function, template convesions are skipped. 785346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 796250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian// Test7 806250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct Base { 81097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith operator int*(); 826250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian}; 836250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian 846250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct Derived : Base { 85f652793d4d32cc71b5ee2167069cbd363baa75deFariborz Jahanian // not the same function as Base's non-const operator int() 868b915e7048b20b0feb60ec90c365a8eb68360cd4Fariborz Jahanian operator int*() const; 876250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian}; 886250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian 89f652793d4d32cc71b5ee2167069cbd363baa75deFariborz Jahanianvoid foo6(const Derived cd, Derived d) { 90097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith // overload resolution selects Derived::operator int*() const; 91097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith delete cd; 92097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith delete d; 936250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian} 946250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian 956250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian// Test8 966250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct BB { 976250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian template<typename T> operator T*() const; 986250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian}; 996250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian 1006250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct DD : BB { 1016250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian template<typename T> operator T*() const; // hides base conversion 1026250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian operator int *() const; 1036250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian}; 1046250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian 1056250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianvoid foo7 (DD d) 1066250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian{ 107097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith // OK. In selecting a conversion to pointer function, template convesions are skipped. 108097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith delete d; 1096250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian} 110