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