Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu %s
      2 // RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu -std=c++98 %s
      3 // RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu -std=c++11 %s
      4 
      5 struct yes;
      6 struct no;
      7 
      8 struct Short {
      9   operator short();
     10 };
     11 
     12 struct Long {
     13   operator long();
     14 };
     15 
     16 enum E1 { };
     17 struct Enum1 {
     18   operator E1();
     19 };
     20 
     21 enum E2 { };
     22 struct Enum2 {
     23   operator E2();
     24 };
     25 
     26 
     27 struct X {
     28   void f();
     29 };
     30 
     31 typedef void (X::*pmf)();
     32 struct Xpmf {
     33   operator pmf();
     34 };
     35 
     36 yes& islong(long);
     37 yes& islong(unsigned long); // FIXME: shouldn't be needed
     38 no& islong(int);
     39 
     40 void f(Short s, Long l, Enum1 e1, Enum2 e2, Xpmf pmf) {
     41   // C++ [over.built]p8
     42   int i1 = +e1;
     43   int i2 = -e2;
     44 
     45   // C++  [over.built]p10:
     46   int i3 = ~s;
     47   bool b1 = !s;
     48 
     49   // C++ [over.built]p12
     50   (void)static_cast<yes&>(islong(s + l));
     51   (void)static_cast<no&>(islong(s + s));
     52 
     53   // C++ [over.built]p16
     54   (void)(pmf == &X::f);
     55   (void)(pmf == 0);
     56 
     57   // C++ [over.built]p17
     58   (void)static_cast<yes&>(islong(s % l));
     59   (void)static_cast<yes&>(islong(l << s));
     60   (void)static_cast<no&>(islong(s << l));
     61   (void)static_cast<yes&>(islong(e1 % l));
     62   // FIXME: should pass (void)static_cast<no&>(islong(e1 % e2));
     63 }
     64 
     65 struct ShortRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}
     66 #if __cplusplus >= 201103L // C++11 or later
     67 // expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}}
     68 #endif
     69   operator short&();
     70 };
     71 
     72 struct LongRef {
     73   operator volatile long&();
     74 };
     75 
     76 struct XpmfRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}
     77 #if __cplusplus >= 201103L // C++11 or later
     78 // expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}}
     79 #endif
     80   operator pmf&();
     81 };
     82 
     83 struct E2Ref {
     84   operator E2&();
     85 };
     86 
     87 void g(ShortRef sr, LongRef lr, E2Ref e2_ref, XpmfRef pmf_ref) {
     88   // C++ [over.built]p3
     89   short s1 = sr++;
     90 
     91   // C++ [over.built]p3
     92   long l1 = lr--;
     93 
     94   // C++ [over.built]p18
     95   short& sr1 = (sr *= lr);
     96   volatile long& lr1 = (lr *= sr);
     97 
     98   // C++ [over.built]p20:
     99   E2 e2r2;
    100   e2r2 = e2_ref;
    101 
    102   pmf &pmr = (pmf_ref = &X::f); // expected-error{{no viable overloaded '='}}
    103   pmf pmr2;
    104   pmr2 = pmf_ref;
    105 
    106   // C++ [over.built]p22
    107   short& sr2 = (sr %= lr);
    108   volatile long& lr2 = (lr <<= sr);
    109 
    110   bool b1 = (sr && lr) || (sr || lr);
    111 }
    112 
    113 struct VolatileIntPtr {
    114   operator int volatile *();
    115 };
    116 
    117 struct ConstIntPtr {
    118   operator int const *();
    119 };
    120 
    121 struct VolatileIntPtrRef {
    122   operator int volatile *&();
    123 };
    124 
    125 struct ConstIntPtrRef {
    126   operator int const *&();
    127 };
    128 
    129 void test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip, ShortRef sr,
    130                     VolatileIntPtrRef vipr, ConstIntPtrRef cipr) {
    131   const int& cir1 = cip[sr];
    132   const int& cir2 = sr[cip];
    133   volatile int& vir1 = vip[sr];
    134   volatile int& vir2 = sr[vip];
    135   bool b1 = (vip == cip);
    136   long p1 = vip - cip;
    137 
    138   // C++ [over.built]p5:
    139   int volatile *vip1 = vipr++;
    140   int const *cip1 = cipr++;
    141   int volatile *&vipr1 = ++vipr;
    142   int const *&cipr1 = --cipr;
    143 
    144   // C++ [over.built]p6:
    145   int volatile &ivr = *vip;
    146 
    147   // C++ [over.built]p8:
    148   int volatile *vip2 = +vip;
    149   int i1 = +sr;
    150   int i2 = -sr;
    151 
    152   // C++ [over.built]p13:
    153   int volatile &ivr2 = vip[17];
    154   int const &icr2 = 17[cip];
    155 }
    156 
    157 // C++ [over.match.open]p4
    158 
    159 void test_assign_restrictions(ShortRef& sr) {
    160   sr = (short)0; // expected-error{{no viable overloaded '='}}
    161 }
    162 
    163 struct Base { };
    164 struct Derived1 : Base { };
    165 struct Derived2 : Base { };
    166 
    167 template<typename T>
    168 struct ConvertibleToPtrOf {
    169   operator T*();
    170 };
    171 
    172 bool test_with_base_ptrs(ConvertibleToPtrOf<Derived1> d1,
    173                          ConvertibleToPtrOf<Derived2> d2) {
    174   return d1 == d2; // expected-error{{invalid operands}}
    175 }
    176 
    177 // DR425
    178 struct A {
    179   template< typename T > operator T() const;
    180 };
    181 
    182 void test_dr425(A a) {
    183   // FIXME: lots of candidates here!
    184   (void)(1.0f * a); // expected-error{{ambiguous}} \
    185                     // expected-note 4{{candidate}} \
    186                     // expected-note {{remaining 140 candidates omitted; pass -fshow-overloads=all to show them}}
    187 }
    188 
    189 // pr5432
    190 enum e {X};
    191 
    192 const int a[][2] = {{1}};
    193 
    194 int test_pr5432() {
    195   return a[X][X];
    196 }
    197 
    198 void f() {
    199   (void)__extension__(A());
    200 }
    201 
    202 namespace PR7319 {
    203   typedef enum { Enum1, Enum2, Enum3 } MyEnum;
    204 
    205   template<typename X> bool operator>(const X &inX1, const X &inX2);
    206 
    207   void f() {
    208     MyEnum e1, e2;
    209     if (e1 > e2) {}
    210   }
    211 }
    212 
    213 namespace PR8477 {
    214   struct Foo {
    215     operator bool();
    216     operator const char *();
    217   };
    218 
    219   bool doit() {
    220     Foo foo;
    221     long long zero = 0;
    222     (void)(foo + zero);
    223     (void)(foo - zero);
    224     (void)(zero + foo);
    225     (void)(zero[foo]);
    226     (void)(foo - foo); // expected-error{{use of overloaded operator '-' is ambiguous}} \
    227     // expected-note 4{{built-in candidate operator-}} \
    228     // expected-note{{candidates omitted}}
    229     return foo[zero] == zero;
    230   }
    231 }
    232 
    233 namespace PR7851 {
    234   struct X {
    235     operator const void *() const;
    236     operator void *();
    237 
    238     operator const unsigned *() const;
    239     operator unsigned *();
    240   };
    241 
    242   void f() {
    243     X x;
    244     x[0] = 1;
    245     *x = 0;
    246     (void)(x - x);
    247   }
    248 }
    249 
    250 namespace PR12854 {
    251   enum { size = 1 };
    252   void plus_equals() {
    253     int* __restrict py;
    254     py += size;
    255   }
    256 
    257   struct RestrictInt {
    258     operator int* __restrict &();
    259   };
    260 
    261   void user_conversions(RestrictInt ri) {
    262     ++ri;
    263     --ri;
    264     ri++;
    265     ri--;
    266   }
    267 }
    268 
    269 namespace PR12964 {
    270   struct X { operator  __int128() const; } x;
    271   bool a = x == __int128(0);
    272   bool b = x == 0;
    273 
    274   struct Y { operator unsigned __int128() const; } y;
    275   bool c = y == __int128(0);
    276   bool d = y == 0;
    277 
    278   bool e = x == y;
    279 }
    280