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