184268904947ada7e251932a6f5b0f4364df7a2c7Richard Smith// RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu %s 2b774d73540ba62a5e6a8e9217b320b27a946cfadNAKAMURA Takumi 3eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorstruct yes; 4eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorstruct no; 5eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 6eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorstruct Short { 7eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor operator short(); 8eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor}; 9eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 10eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorstruct Long { 11eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor operator long(); 12eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor}; 13eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 14447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorenum E1 { }; 15447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorstruct Enum1 { 16447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor operator E1(); 17447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor}; 18447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor 19447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorenum E2 { }; 20447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorstruct Enum2 { 21447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor operator E2(); 22447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor}; 23447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor 2420b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 2520b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregorstruct X { 2620b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor void f(); 2720b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor}; 2820b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 2920b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregortypedef void (X::*pmf)(); 3020b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregorstruct Xpmf { 3120b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor operator pmf(); 3220b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor}; 3320b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 34eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregoryes& islong(long); 35447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregoryes& islong(unsigned long); // FIXME: shouldn't be needed 36eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorno& islong(int); 37eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 3820b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregorvoid f(Short s, Long l, Enum1 e1, Enum2 e2, Xpmf pmf) { 3974253736184c0717a0649922551bf9d8b6815651Douglas Gregor // C++ [over.built]p8 4074253736184c0717a0649922551bf9d8b6815651Douglas Gregor int i1 = +e1; 4174253736184c0717a0649922551bf9d8b6815651Douglas Gregor int i2 = -e2; 4274253736184c0717a0649922551bf9d8b6815651Douglas Gregor 4374253736184c0717a0649922551bf9d8b6815651Douglas Gregor // C++ [over.built]p10: 4474253736184c0717a0649922551bf9d8b6815651Douglas Gregor int i3 = ~s; 4574253736184c0717a0649922551bf9d8b6815651Douglas Gregor bool b1 = !s; 4674253736184c0717a0649922551bf9d8b6815651Douglas Gregor 47eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor // C++ [over.built]p12 48eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor (void)static_cast<yes&>(islong(s + l)); 49eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor (void)static_cast<no&>(islong(s + s)); 50eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 5120b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor // C++ [over.built]p16 5220b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor (void)(pmf == &X::f); 5320b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor (void)(pmf == 0); 5420b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 55eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor // C++ [over.built]p17 56eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor (void)static_cast<yes&>(islong(s % l)); 57eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor (void)static_cast<yes&>(islong(l << s)); 58eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor (void)static_cast<no&>(islong(s << l)); 59447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor (void)static_cast<yes&>(islong(e1 % l)); 60447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor // FIXME: should pass (void)static_cast<no&>(islong(e1 % e2)); 61eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor} 62eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 63220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCallstruct ShortRef { // expected-note{{candidate function (the implicit copy assignment operator)}} 64eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor operator short&(); 65eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor}; 66eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 67eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorstruct LongRef { 68eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor operator volatile long&(); 69eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor}; 70eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 71220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCallstruct XpmfRef { // expected-note{{candidate function (the implicit copy assignment operator)}} 7220b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor operator pmf&(); 7320b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor}; 7420b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 7520b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregorstruct E2Ref { 7620b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor operator E2&(); 7720b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor}; 7820b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 7920b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregorvoid g(ShortRef sr, LongRef lr, E2Ref e2_ref, XpmfRef pmf_ref) { 8074253736184c0717a0649922551bf9d8b6815651Douglas Gregor // C++ [over.built]p3 8174253736184c0717a0649922551bf9d8b6815651Douglas Gregor short s1 = sr++; 8274253736184c0717a0649922551bf9d8b6815651Douglas Gregor 8374253736184c0717a0649922551bf9d8b6815651Douglas Gregor // C++ [over.built]p3 8474253736184c0717a0649922551bf9d8b6815651Douglas Gregor long l1 = lr--; 8574253736184c0717a0649922551bf9d8b6815651Douglas Gregor 86eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor // C++ [over.built]p18 87eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor short& sr1 = (sr *= lr); 88eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor volatile long& lr1 = (lr *= sr); 89eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 9020b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor // C++ [over.built]p20: 9120b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor E2 e2r2; 9220b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor e2r2 = e2_ref; 9320b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 9420b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor pmf &pmr = (pmf_ref = &X::f); // expected-error{{no viable overloaded '='}} 9520b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor pmf pmr2; 9620b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor pmr2 = pmf_ref; 9720b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor 98eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor // C++ [over.built]p22 99eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor short& sr2 = (sr %= lr); 100eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor volatile long& lr2 = (lr <<= sr); 101eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 102eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor bool b1 = (sr && lr) || (sr || lr); 103eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor} 104eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 105eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorstruct VolatileIntPtr { 106eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor operator int volatile *(); 107eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor}; 108eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 109eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorstruct ConstIntPtr { 110eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor operator int const *(); 111eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor}; 112eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 11374253736184c0717a0649922551bf9d8b6815651Douglas Gregorstruct VolatileIntPtrRef { 11474253736184c0717a0649922551bf9d8b6815651Douglas Gregor operator int volatile *&(); 11574253736184c0717a0649922551bf9d8b6815651Douglas Gregor}; 11674253736184c0717a0649922551bf9d8b6815651Douglas Gregor 11774253736184c0717a0649922551bf9d8b6815651Douglas Gregorstruct ConstIntPtrRef { 11874253736184c0717a0649922551bf9d8b6815651Douglas Gregor operator int const *&(); 11974253736184c0717a0649922551bf9d8b6815651Douglas Gregor}; 12074253736184c0717a0649922551bf9d8b6815651Douglas Gregor 12174253736184c0717a0649922551bf9d8b6815651Douglas Gregorvoid test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip, ShortRef sr, 12274253736184c0717a0649922551bf9d8b6815651Douglas Gregor VolatileIntPtrRef vipr, ConstIntPtrRef cipr) { 123eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor const int& cir1 = cip[sr]; 124eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor const int& cir2 = sr[cip]; 125eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor volatile int& vir1 = vip[sr]; 126eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor volatile int& vir2 = sr[vip]; 127eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor bool b1 = (vip == cip); 128eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor long p1 = vip - cip; 12974253736184c0717a0649922551bf9d8b6815651Douglas Gregor 13074253736184c0717a0649922551bf9d8b6815651Douglas Gregor // C++ [over.built]p5: 13174253736184c0717a0649922551bf9d8b6815651Douglas Gregor int volatile *vip1 = vipr++; 13274253736184c0717a0649922551bf9d8b6815651Douglas Gregor int const *cip1 = cipr++; 13374253736184c0717a0649922551bf9d8b6815651Douglas Gregor int volatile *&vipr1 = ++vipr; 13474253736184c0717a0649922551bf9d8b6815651Douglas Gregor int const *&cipr1 = --cipr; 13574253736184c0717a0649922551bf9d8b6815651Douglas Gregor 13674253736184c0717a0649922551bf9d8b6815651Douglas Gregor // C++ [over.built]p6: 13774253736184c0717a0649922551bf9d8b6815651Douglas Gregor int volatile &ivr = *vip; 13874253736184c0717a0649922551bf9d8b6815651Douglas Gregor 13974253736184c0717a0649922551bf9d8b6815651Douglas Gregor // C++ [over.built]p8: 14074253736184c0717a0649922551bf9d8b6815651Douglas Gregor int volatile *vip2 = +vip; 14174253736184c0717a0649922551bf9d8b6815651Douglas Gregor int i1 = +sr; 14274253736184c0717a0649922551bf9d8b6815651Douglas Gregor int i2 = -sr; 143337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 144337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor // C++ [over.built]p13: 145337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor int volatile &ivr2 = vip[17]; 146337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor int const &icr2 = 17[cip]; 147eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor} 14874253736184c0717a0649922551bf9d8b6815651Douglas Gregor 14988b4bf202a6bb67ed241281b8dea973f38df2782Douglas Gregor// C++ [over.match.open]p4 15088b4bf202a6bb67ed241281b8dea973f38df2782Douglas Gregor 15188b4bf202a6bb67ed241281b8dea973f38df2782Douglas Gregorvoid test_assign_restrictions(ShortRef& sr) { 1528593c7810fba6548679e7c89d8eaccebf4d5ec20Sebastian Redl sr = (short)0; // expected-error{{no viable overloaded '='}} 15388b4bf202a6bb67ed241281b8dea973f38df2782Douglas Gregor} 154652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor 155652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregorstruct Base { }; 156652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregorstruct Derived1 : Base { }; 157652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregorstruct Derived2 : Base { }; 158652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor 159652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregortemplate<typename T> 160652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregorstruct ConvertibleToPtrOf { 161652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor operator T*(); 162652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor}; 163652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor 164652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregorbool test_with_base_ptrs(ConvertibleToPtrOf<Derived1> d1, 165652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor ConvertibleToPtrOf<Derived2> d2) { 166652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor return d1 == d2; // expected-error{{invalid operands}} 167652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor} 168652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor 169652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor// DR425 170652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregorstruct A { 171652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor template< typename T > operator T() const; 172652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor}; 173652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor 174652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregorvoid test_dr425(A a) { 175652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor // FIXME: lots of candidates here! 176652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor (void)(1.0f * a); // expected-error{{ambiguous}} \ 1775edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin // expected-note 4{{candidate}} \ 1783c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith // expected-note {{remaining 117 candidates omitted; pass -fshow-overloads=all to show them}} 179652371ad0427b2310ff01ea22fdc37f02d19abe8Douglas Gregor} 180d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanian 181d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanian// pr5432 182d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanianenum e {X}; 183d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanian 184d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanianconst int a[][2] = {{1}}; 185d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanian 186d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanianint test_pr5432() { 187d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanian return a[X][X]; 188d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanian} 189d411b3f746e612294bd5f0843d83e8c215f7fe58Fariborz Jahanian 190a8a1e3da7cc741ab36be18041fafbebdc9be826bAnders Carlssonvoid f() { 191a8a1e3da7cc741ab36be18041fafbebdc9be826bAnders Carlsson (void)__extension__(A()); 192a8a1e3da7cc741ab36be18041fafbebdc9be826bAnders Carlsson} 193ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor 194ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregornamespace PR7319 { 195ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor typedef enum { Enum1, Enum2, Enum3 } MyEnum; 196ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor 197ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor template<typename X> bool operator>(const X &inX1, const X &inX2); 198ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor 199ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor void f() { 200ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor MyEnum e1, e2; 201ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor if (e1 > e2) {} 202ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor } 203ccd471341d2edbb18ac9c46a7c65d280d9c6223eDouglas Gregor} 204fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor 205fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregornamespace PR8477 { 206fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor struct Foo { 207fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor operator bool(); 208fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor operator const char *(); 209fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor }; 210fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor 211fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor bool doit() { 212fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor Foo foo; 213fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor long long zero = 0; 214fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor (void)(foo + zero); 215fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor (void)(foo - zero); 216fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor (void)(zero + foo); 217fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor (void)(zero[foo]); 218fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor (void)(foo - foo); // expected-error{{use of overloaded operator '-' is ambiguous}} \ 219fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor // expected-note 4{{built-in candidate operator-}} \ 220fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor // expected-note{{candidates omitted}} 221fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor return foo[zero] == zero; 222fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor } 223fec56e7e341cd1d9a861d64bffc80a97aed89802Douglas Gregor} 2242fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor 2252fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregornamespace PR7851 { 2262fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor struct X { 2272fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor operator const void *() const; 2282fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor operator void *(); 2292fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor 2302fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor operator const unsigned *() const; 2312fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor operator unsigned *(); 2322fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor }; 2332fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor 2342fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor void f() { 2352fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor X x; 2362fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor x[0] = 1; 2372fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor *x = 0; 2382fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor (void)(x - x); 2392fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor } 2402fdc5e8199e1e239620f2faae88997153703e16fDouglas Gregor} 241b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor 242b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregornamespace PR12854 { 243b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor enum { size = 1 }; 244b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor void plus_equals() { 245b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor int* __restrict py; 246b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor py += size; 247b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor } 248b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor 249b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor struct RestrictInt { 250b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor operator int* __restrict &(); 251b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor }; 252b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor 253b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor void user_conversions(RestrictInt ri) { 254b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor ++ri; 255b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor --ri; 256b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor ri++; 257b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor ri--; 258b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor } 259b1c6f5fa23015fb5ee063fa5eb9717ea5d78cf12Douglas Gregor} 2603c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith 2613c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smithnamespace PR12964 { 2623c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith struct X { operator __int128() const; } x; 2633c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith bool a = x == __int128(0); 2643c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith bool b = x == 0; 2653c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith 2663c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith struct Y { operator unsigned __int128() const; } y; 2673c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith bool c = y == __int128(0); 2683c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith bool d = y == 0; 2693c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith 2703c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith bool e = x == y; 2713c2fcf8705023e1d91d1c85dc7c8a4aa2248050bRichard Smith} 272