xref: /llvm-project/clang/test/SemaCXX/conversion-delete-expr.cpp (revision b54ccb2782bff6e6be75a5c27e4bb33586ce5ce0)
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