brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 0c76df7 Raw
293 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu %s2// RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu -std=c++98 %s3// RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu -std=c++11 %s4 5struct yes;6struct no;7 8struct Short {9  operator short();10};11 12struct Long {13  operator long();14};15 16enum E1 { };17struct Enum1 {18  operator E1();19};20 21enum E2 { };22struct Enum2 {23  operator E2();24};25 26 27struct X { 28  void f();29};30 31typedef void (X::*pmf)();32struct Xpmf {33  operator pmf();34};35 36yes& islong(long);37yes& islong(unsigned long); // FIXME: shouldn't be needed38no& islong(int);39 40void f(Short s, Long l, Enum1 e1, Enum2 e2, Xpmf pmf) {41  // C++ [over.built]p842  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]p1250  (void)static_cast<yes&>(islong(s + l));51  (void)static_cast<no&>(islong(s + s));52 53  // C++ [over.built]p1654  (void)(pmf == &X::f);55  (void)(pmf == 0);56  57  // C++ [over.built]p1758  (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 65struct BoolRef {66  operator bool&();67};68 69struct ShortRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}70#if __cplusplus >= 201103L // C++11 or later71// expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}}72#endif73  operator short&();74};75 76struct LongRef {77  operator volatile long&();78};79 80struct FloatRef {81  operator float&();82};83 84struct XpmfRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}85#if __cplusplus >= 201103L // C++11 or later86// expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}}87#endif88  operator pmf&();89};90 91struct E2Ref {92  operator E2&();93};94 95void g(BoolRef br, ShortRef sr, LongRef lr, FloatRef fr, E2Ref e2_ref, XpmfRef pmf_ref) {96  // C++ [over.built]p397  short s1 = sr++;98 99  // C++ [over.built]p4100  long l1 = lr--;101 102  // C++ [over.built]p4103  float f1 = fr--;104 105  // C++ [over.built]p4106  bool b2 = br--; // expected-error{{cannot decrement value of type 'BoolRef'}}107 108  // C++ [over.built]p18109  short& sr1 = (sr *= lr);110  volatile long& lr1 = (lr *= sr);111 112  // C++ [over.built]p20:113  E2 e2r2;114  e2r2 = e2_ref;115  116  pmf &pmr = (pmf_ref = &X::f); // expected-error{{no viable overloaded '='}}117  pmf pmr2;118  pmr2 = pmf_ref;119               120  // C++ [over.built]p22121  short& sr2 = (sr %= lr);122  volatile long& lr2 = (lr <<= sr);123 124  bool b1 = (sr && lr) || (sr || lr);125}126 127struct VolatileIntPtr {128  operator int volatile *();129};130 131struct ConstIntPtr {132  operator int const *();133};134 135struct VolatileIntPtrRef {136  operator int volatile *&();137};138 139struct ConstIntPtrRef {140  operator int const *&();141};142 143void test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip, ShortRef sr,144                    VolatileIntPtrRef vipr, ConstIntPtrRef cipr) {145  const int& cir1 = cip[sr];146  const int& cir2 = sr[cip];147  volatile int& vir1 = vip[sr];148  volatile int& vir2 = sr[vip];149  bool b1 = (vip == cip);150  long p1 = vip - cip;151 152  // C++ [over.built]p5:153  int volatile *vip1 = vipr++;154  int const *cip1 = cipr++;155  int volatile *&vipr1 = ++vipr;156  int const *&cipr1 = --cipr;157 158  // C++ [over.built]p6:159  int volatile &ivr = *vip;160 161  // C++ [over.built]p8:162  int volatile *vip2 = +vip;163  int i1 = +sr;164  int i2 = -sr;165 166  // C++ [over.built]p13:167  int volatile &ivr2 = vip[17];168  int const &icr2 = 17[cip];169}170 171// C++ [over.match.open]p4172 173void test_assign_restrictions(ShortRef& sr) {174  sr = (short)0; // expected-error{{no viable overloaded '='}}175}176 177struct Base { };178struct Derived1 : Base { };179struct Derived2 : Base { };180 181template<typename T>182struct ConvertibleToPtrOf {183  operator T*();184};185 186bool test_with_base_ptrs(ConvertibleToPtrOf<Derived1> d1, 187                         ConvertibleToPtrOf<Derived2> d2) {188  return d1 == d2; // expected-error{{invalid operands}}189}190 191// DR425192struct A {193  template< typename T > operator T() const;194};195 196void test_dr425(A a) {197  (void)(1.0f * a); // expected-error{{ambiguous}} \198                    // expected-note 12{{candidate}}199}200 201// pr5432202enum e {X};203 204const int a[][2] = {{1}};205 206int test_pr5432() {207  return a[X][X];208}209 210void f() {211  (void)__extension__(A());212}213 214namespace PR7319 {215  typedef enum { Enum1, Enum2, Enum3 } MyEnum;216 217  template<typename X> bool operator>(const X &inX1, const X &inX2);218 219  void f() {220    MyEnum e1, e2;221    if (e1 > e2) {}222  }223}224 225namespace PR8477 {226  struct Foo {227    operator bool();228    operator const char *();229  };230 231  bool doit() {232    Foo foo;233    long long zero = 0;234    (void)(foo + zero);235    (void)(foo - zero);236    (void)(zero + foo);237    (void)(zero[foo]);238    // FIXME: It would be nice to report fewer candidates here.239    (void)(foo - foo); // expected-error{{use of overloaded operator '-' is ambiguous}} \240    // expected-note 4{{built-in candidate operator-}} \241    // expected-note{{142 candidates omitted}}242    return foo[zero] == zero;243  }244}245 246namespace PR7851 {247  struct X {248    operator const void *() const;249    operator void *();250 251    operator const unsigned *() const;252    operator unsigned *();253  };254 255  void f() {256    X x;257    x[0] = 1;258    *x = 0;259    (void)(x - x);260  }261}262 263namespace PR12854 {264  enum { size = 1 };265  void plus_equals() {266    int* __restrict py;267    py += size;268  }269 270  struct RestrictInt {271    operator int* __restrict &();272  };273 274  void user_conversions(RestrictInt ri) {275    ++ri;276    --ri;277    ri++;278    ri--;279  }280}281 282namespace PR12964 {283  struct X { operator  __int128() const; } x;284  bool a = x == __int128(0);285  bool b = x == 0;286 287  struct Y { operator unsigned __int128() const; } y;288  bool c = y == __int128(0);289  bool d = y == 0;290 291  bool e = x == y;292}293