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