1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
25346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
35346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test1
45346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B {
5097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  operator char *(); // expected-note {{conversion to pointer type}}
65346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
75346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
85346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D : B {
9097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  operator int *(); // expected-note {{conversion to pointer type}}
105346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
115346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
125346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f (D d)
135346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{
147c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall   delete d; // expected-error {{ambiguous conversion of delete expression of type 'D' to a pointer}}
155346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}
165346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
175346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test2
185346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B1 {
195346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian  operator int *();
205346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
215346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
225346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D1 : B1 {
235346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian  operator int *();
245346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
255346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
265346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f1 (D1 d)
275346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{
285346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian   delete d;
295346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}
305346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
315346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test3
325346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B2 {
33097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  operator const int *(); // expected-note {{conversion to pointer type}}
345346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
355346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
365346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D2 : B2 {
37097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  operator int *(); // expected-note {{conversion to pointer type}}
385346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
395346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
405346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f2 (D2 d)
415346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{
427c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall   delete d; // expected-error {{ambiguous conversion of delete expression of type 'D2' to a pointer}}
435346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}
445346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
455346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test4
465346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct B3 {
47097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  operator const int *(); // expected-note {{conversion to pointer type}}
485346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
495346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
505346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct A3 {
51097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  operator const int *(); // expected-note {{conversion to pointer type}}
525346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
535346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
545346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct D3 : A3, B3 {
555346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
565346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
575346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f3 (D3 d)
585346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian{
597c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall   delete d; // expected-error {{ambiguous conversion of delete expression of type 'D3' to a pointer}}
605346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}
615346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
625346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test5
635346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct X {
645346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian   operator int();
655346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian   operator int*();
665346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
675346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
685346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianvoid f4(X x) { delete x; delete x; }
695346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
705346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian// Test6
715346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanianstruct X1 {
725346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian   operator int();
735346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian   operator int*();
745346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian   template<typename T> operator T*() const; // converts to any pointer!
755346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian};
765346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
77d7c3e4e9d72a4080664f10c1a1e6160e0de8be76Fariborz Jahanianvoid f5(X1 x) { delete x; }  // OK. In selecting a conversion to pointer function, template convesions are skipped.
785346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
796250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian// Test7
806250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct Base {
81097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith   operator int*();
826250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian};
836250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian
846250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct Derived : Base {
85f652793d4d32cc71b5ee2167069cbd363baa75deFariborz Jahanian   // not the same function as Base's non-const operator int()
868b915e7048b20b0feb60ec90c365a8eb68360cd4Fariborz Jahanian   operator int*() const;
876250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian};
886250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian
89f652793d4d32cc71b5ee2167069cbd363baa75deFariborz Jahanianvoid foo6(const Derived cd, Derived d) {
90097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  // overload resolution selects Derived::operator int*() const;
91097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  delete cd;
92097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  delete d;
936250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian}
946250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian
956250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian// Test8
966250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct BB {
976250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian   template<typename T> operator T*() const;
986250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian};
996250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian
1006250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianstruct DD : BB {
1016250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian   template<typename T> operator T*() const; // hides base conversion
1026250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian   operator int *() const;
1036250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian};
1046250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian
1056250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanianvoid foo7 (DD d)
1066250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian{
107097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  // OK. In selecting a conversion to pointer function, template convesions are skipped.
108097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith  delete d;
1096250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian}
110