1*b54ccb27SFariborz Jahanian // RUN: clang-cc -fsyntax-only -verify -std=c++0x %s 2*b54ccb27SFariborz Jahanian 3*b54ccb27SFariborz Jahanian // Test1 4*b54ccb27SFariborz Jahanian struct B { 5*b54ccb27SFariborz Jahanian operator char *(); 6*b54ccb27SFariborz Jahanian }; 7*b54ccb27SFariborz Jahanian 8*b54ccb27SFariborz Jahanian struct D : B { 9*b54ccb27SFariborz Jahanian operator int *(); 10*b54ccb27SFariborz Jahanian }; 11*b54ccb27SFariborz Jahanian 12*b54ccb27SFariborz Jahanian void f (D d) 13*b54ccb27SFariborz Jahanian { 14*b54ccb27SFariborz Jahanian delete d; // expected-error {{cannot delete expression of type 'struct D'}} 15*b54ccb27SFariborz Jahanian } 16*b54ccb27SFariborz Jahanian 17*b54ccb27SFariborz Jahanian // Test2 18*b54ccb27SFariborz Jahanian struct B1 { 19*b54ccb27SFariborz Jahanian operator int *(); 20*b54ccb27SFariborz Jahanian }; 21*b54ccb27SFariborz Jahanian 22*b54ccb27SFariborz Jahanian struct D1 : B1 { 23*b54ccb27SFariborz Jahanian operator int *(); 24*b54ccb27SFariborz Jahanian }; 25*b54ccb27SFariborz Jahanian 26*b54ccb27SFariborz Jahanian void f1 (D1 d) 27*b54ccb27SFariborz Jahanian { 28*b54ccb27SFariborz Jahanian delete d; 29*b54ccb27SFariborz Jahanian } 30*b54ccb27SFariborz Jahanian 31*b54ccb27SFariborz Jahanian // Test3 32*b54ccb27SFariborz Jahanian struct B2 { 33*b54ccb27SFariborz Jahanian operator const int *(); 34*b54ccb27SFariborz Jahanian }; 35*b54ccb27SFariborz Jahanian 36*b54ccb27SFariborz Jahanian struct D2 : B2 { 37*b54ccb27SFariborz Jahanian operator int *(); 38*b54ccb27SFariborz Jahanian }; 39*b54ccb27SFariborz Jahanian 40*b54ccb27SFariborz Jahanian void f2 (D2 d) 41*b54ccb27SFariborz Jahanian { 42*b54ccb27SFariborz Jahanian delete d; // expected-error {{cannot delete expression of type 'struct D2'}} 43*b54ccb27SFariborz Jahanian } 44*b54ccb27SFariborz Jahanian 45*b54ccb27SFariborz Jahanian // Test4 46*b54ccb27SFariborz Jahanian 47*b54ccb27SFariborz Jahanian struct B3 { 48*b54ccb27SFariborz Jahanian operator const int *(); 49*b54ccb27SFariborz Jahanian }; 50*b54ccb27SFariborz Jahanian 51*b54ccb27SFariborz Jahanian struct A3 { 52*b54ccb27SFariborz Jahanian operator const int *(); 53*b54ccb27SFariborz Jahanian }; 54*b54ccb27SFariborz Jahanian 55*b54ccb27SFariborz Jahanian struct D3 : A3, B3 { 56*b54ccb27SFariborz Jahanian }; 57*b54ccb27SFariborz Jahanian 58*b54ccb27SFariborz Jahanian void f3 (D3 d) 59*b54ccb27SFariborz Jahanian { 60*b54ccb27SFariborz Jahanian delete d; // expected-error {{cannot delete expression of type 'struct D3'}} 61*b54ccb27SFariborz Jahanian } 62*b54ccb27SFariborz Jahanian 63*b54ccb27SFariborz Jahanian // Test5 64*b54ccb27SFariborz Jahanian struct X { 65*b54ccb27SFariborz Jahanian operator int(); 66*b54ccb27SFariborz Jahanian operator int*(); 67*b54ccb27SFariborz Jahanian }; 68*b54ccb27SFariborz Jahanian 69*b54ccb27SFariborz Jahanian void f4(X x) { delete x; delete x; } 70*b54ccb27SFariborz Jahanian 71*b54ccb27SFariborz Jahanian // Test6 72*b54ccb27SFariborz Jahanian 73*b54ccb27SFariborz Jahanian struct X1 { 74*b54ccb27SFariborz Jahanian operator int(); 75*b54ccb27SFariborz Jahanian operator int*(); 76*b54ccb27SFariborz Jahanian template<typename T> operator T*() const; // converts to any pointer! 77*b54ccb27SFariborz Jahanian }; 78*b54ccb27SFariborz Jahanian 79*b54ccb27SFariborz Jahanian void f5(X1 x) { delete x; } // FIXME. May have to issue error here too. 80*b54ccb27SFariborz Jahanian 81*b54ccb27SFariborz Jahanian 82*b54ccb27SFariborz Jahanian 83*b54ccb27SFariborz Jahanian 84