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 77*22430144SFariborz Jahanian void f5(X1 x) { delete x; } // OK. In selecting a conversion to pointer function, template convesions are skipped. 78b54ccb27SFariborz Jahanian 79b394f50aSFariborz Jahanian // Test7 80b394f50aSFariborz Jahanian struct Base { 81b394f50aSFariborz Jahanian operator int*(); 82b394f50aSFariborz Jahanian }; 83b394f50aSFariborz Jahanian 84b394f50aSFariborz Jahanian struct Derived : Base { 85b394f50aSFariborz Jahanian operator int*() const; // not the same function as Base's non-const operator int() 86b394f50aSFariborz Jahanian }; 87b394f50aSFariborz Jahanian 88b394f50aSFariborz Jahanian void foo6(const Derived cd) { 89b394f50aSFariborz Jahanian // FIXME. overload resolution must select Derived::operator int*() const; 90b394f50aSFariborz Jahanian delete cd; // expected-error {{cannot delete expression of type 'struct Derived const'}} 91b394f50aSFariborz Jahanian } 92b394f50aSFariborz Jahanian 93b394f50aSFariborz Jahanian // Test8 94b394f50aSFariborz Jahanian struct BB { 95b394f50aSFariborz Jahanian template<typename T> operator T*() const; 96b394f50aSFariborz Jahanian }; 97b394f50aSFariborz Jahanian 98b394f50aSFariborz Jahanian struct DD : BB { 99b394f50aSFariborz Jahanian template<typename T> operator T*() const; // hides base conversion 100b394f50aSFariborz Jahanian operator int *() const; 101b394f50aSFariborz Jahanian }; 102b394f50aSFariborz Jahanian 103b394f50aSFariborz Jahanian void foo7 (DD d) 104b394f50aSFariborz Jahanian { 105*22430144SFariborz Jahanian // OK. In selecting a conversion to pointer function, template convesions are skipped. 106b394f50aSFariborz Jahanian delete d; 107b394f50aSFariborz Jahanian } 108b394f50aSFariborz Jahanian 109b54ccb27SFariborz Jahanian 110b54ccb27SFariborz Jahanian 111b54ccb27SFariborz Jahanian 112