1b54ccb27SFariborz Jahanian // RUN: clang-cc -fsyntax-only -verify -std=c++0x %s 2b54ccb27SFariborz Jahanian 3b54ccb27SFariborz Jahanian // Test1 4b54ccb27SFariborz Jahanian struct B { 5b54ccb27SFariborz Jahanian operator char *(); 6b54ccb27SFariborz Jahanian }; 7b54ccb27SFariborz Jahanian 8b54ccb27SFariborz Jahanian struct D : B { 9b54ccb27SFariborz Jahanian operator int *(); 10b54ccb27SFariborz Jahanian }; 11b54ccb27SFariborz Jahanian 12b54ccb27SFariborz Jahanian void f (D d) 13b54ccb27SFariborz Jahanian { 14b54ccb27SFariborz Jahanian delete d; // expected-error {{cannot delete expression of type 'struct D'}} 15b54ccb27SFariborz Jahanian } 16b54ccb27SFariborz Jahanian 17b54ccb27SFariborz Jahanian // Test2 18b54ccb27SFariborz Jahanian struct B1 { 19b54ccb27SFariborz Jahanian operator int *(); 20b54ccb27SFariborz Jahanian }; 21b54ccb27SFariborz Jahanian 22b54ccb27SFariborz Jahanian struct D1 : B1 { 23b54ccb27SFariborz Jahanian operator int *(); 24b54ccb27SFariborz Jahanian }; 25b54ccb27SFariborz Jahanian 26b54ccb27SFariborz Jahanian void f1 (D1 d) 27b54ccb27SFariborz Jahanian { 28b54ccb27SFariborz Jahanian delete d; 29b54ccb27SFariborz Jahanian } 30b54ccb27SFariborz Jahanian 31b54ccb27SFariborz Jahanian // Test3 32b54ccb27SFariborz Jahanian struct B2 { 33b54ccb27SFariborz Jahanian operator const int *(); 34b54ccb27SFariborz Jahanian }; 35b54ccb27SFariborz Jahanian 36b54ccb27SFariborz Jahanian struct D2 : B2 { 37b54ccb27SFariborz Jahanian operator int *(); 38b54ccb27SFariborz Jahanian }; 39b54ccb27SFariborz Jahanian 40b54ccb27SFariborz Jahanian void f2 (D2 d) 41b54ccb27SFariborz Jahanian { 42b54ccb27SFariborz Jahanian delete d; // expected-error {{cannot delete expression of type 'struct D2'}} 43b54ccb27SFariborz Jahanian } 44b54ccb27SFariborz Jahanian 45b54ccb27SFariborz Jahanian // Test4 46b54ccb27SFariborz Jahanian struct B3 { 47b54ccb27SFariborz Jahanian operator const int *(); 48b54ccb27SFariborz Jahanian }; 49b54ccb27SFariborz Jahanian 50b54ccb27SFariborz Jahanian struct A3 { 51b54ccb27SFariborz Jahanian operator const int *(); 52b54ccb27SFariborz Jahanian }; 53b54ccb27SFariborz Jahanian 54b54ccb27SFariborz Jahanian struct D3 : A3, B3 { 55b54ccb27SFariborz Jahanian }; 56b54ccb27SFariborz Jahanian 57b54ccb27SFariborz Jahanian void f3 (D3 d) 58b54ccb27SFariborz Jahanian { 59b54ccb27SFariborz Jahanian delete d; // expected-error {{cannot delete expression of type 'struct D3'}} 60b54ccb27SFariborz Jahanian } 61b54ccb27SFariborz Jahanian 62b54ccb27SFariborz Jahanian // Test5 63b54ccb27SFariborz Jahanian struct X { 64b54ccb27SFariborz Jahanian operator int(); 65b54ccb27SFariborz Jahanian operator int*(); 66b54ccb27SFariborz Jahanian }; 67b54ccb27SFariborz Jahanian 68b54ccb27SFariborz Jahanian void f4(X x) { delete x; delete x; } 69b54ccb27SFariborz Jahanian 70b54ccb27SFariborz Jahanian // Test6 71b54ccb27SFariborz Jahanian struct X1 { 72b54ccb27SFariborz Jahanian operator int(); 73b54ccb27SFariborz Jahanian operator int*(); 74b54ccb27SFariborz Jahanian template<typename T> operator T*() const; // converts to any pointer! 75b54ccb27SFariborz Jahanian }; 76b54ccb27SFariborz Jahanian 77b54ccb27SFariborz Jahanian void f5(X1 x) { delete x; } // FIXME. May have to issue error here too. 78b54ccb27SFariborz Jahanian 79*b394f50aSFariborz Jahanian // Test7 80*b394f50aSFariborz Jahanian struct Base { 81*b394f50aSFariborz Jahanian operator int*(); 82*b394f50aSFariborz Jahanian }; 83*b394f50aSFariborz Jahanian 84*b394f50aSFariborz Jahanian struct Derived : Base { 85*b394f50aSFariborz Jahanian operator int*() const; // not the same function as Base's non-const operator int() 86*b394f50aSFariborz Jahanian }; 87*b394f50aSFariborz Jahanian 88*b394f50aSFariborz Jahanian void foo6(const Derived cd) { 89*b394f50aSFariborz Jahanian // FIXME. overload resolution must select Derived::operator int*() const; 90*b394f50aSFariborz Jahanian delete cd; // expected-error {{cannot delete expression of type 'struct Derived const'}} 91*b394f50aSFariborz Jahanian } 92*b394f50aSFariborz Jahanian 93*b394f50aSFariborz Jahanian // Test8 94*b394f50aSFariborz Jahanian struct BB { 95*b394f50aSFariborz Jahanian template<typename T> operator T*() const; 96*b394f50aSFariborz Jahanian }; 97*b394f50aSFariborz Jahanian 98*b394f50aSFariborz Jahanian struct DD : BB { 99*b394f50aSFariborz Jahanian template<typename T> operator T*() const; // hides base conversion 100*b394f50aSFariborz Jahanian operator int *() const; 101*b394f50aSFariborz Jahanian }; 102*b394f50aSFariborz Jahanian 103*b394f50aSFariborz Jahanian void foo7 (DD d) 104*b394f50aSFariborz Jahanian { 105*b394f50aSFariborz Jahanian // FIXME. We select DD::operator int *() const; g++ issues ambiguity error. Investigate. 106*b394f50aSFariborz Jahanian delete d; 107*b394f50aSFariborz Jahanian } 108*b394f50aSFariborz Jahanian 109b54ccb27SFariborz Jahanian 110b54ccb27SFariborz Jahanian 111b54ccb27SFariborz Jahanian 112