xref: /llvm-project/clang/test/SemaObjCXX/arc-ptr-comparison.mm (revision 351317167e2b28aad03f8e45e0ed0acbbff18c61)
1*35131716SErik Pilkington// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-runtime-has-weak -fobjc-arc -verify %s
2df42cf10SAlex Lorenz// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin11 -fsyntax-only -verify -DNOARC %s
3df42cf10SAlex Lorenz#ifdef NOARC
4df42cf10SAlex Lorenz// expected-no-diagnostics
5df42cf10SAlex Lorenz#endif
6df42cf10SAlex Lorenz
7df42cf10SAlex Lorenzint testObjCComparisonRules(void *v, id x, id y) {
8df42cf10SAlex Lorenz  return v == x;
9df42cf10SAlex Lorenz#ifndef NOARC
10df42cf10SAlex Lorenz// expected-error@-2 {{implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}}
11df42cf10SAlex Lorenz// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}}
12df42cf10SAlex Lorenz// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'void *'}}
13df42cf10SAlex Lorenz#endif
14df42cf10SAlex Lorenz  return v >= x;
15df42cf10SAlex Lorenz#ifndef NOARC
16df42cf10SAlex Lorenz// expected-error@-2 {{implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}}
17df42cf10SAlex Lorenz// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}}
18df42cf10SAlex Lorenz// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'void *'}}
19df42cf10SAlex Lorenz#endif
20df42cf10SAlex Lorenz  return v == (id)(void *)0; // OK
21df42cf10SAlex Lorenz  return v == nullptr; // OK
22df42cf10SAlex Lorenz  return v == (void *)0;
23df42cf10SAlex Lorenz  return x == y;
24df42cf10SAlex Lorenz}
25fbf915f0SRichard Smith
26fbf915f0SRichard Smith@class A;
27fbf915f0SRichard Smith
28fbf915f0SRichard Smithint testMixedQualComparisonRules(void *v, const void *cv, A *a, const A *ca) {
29fbf915f0SRichard Smith  return cv == ca;
30fbf915f0SRichard Smith#ifndef NOARC
31fbf915f0SRichard Smith// expected-error@-2 {{implicit conversion of Objective-C pointer type 'const A *' to C pointer type 'const void *' requires a bridged cast}}
32fbf915f0SRichard Smith// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}}
33fbf915f0SRichard Smith// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'const void *'}}
34fbf915f0SRichard Smith#endif
35fbf915f0SRichard Smith  // FIXME: The "to" type in this diagnostic is wrong; we should convert to "const void *".
36fbf915f0SRichard Smith  return v == ca;
37fbf915f0SRichard Smith#ifndef NOARC
38fbf915f0SRichard Smith// expected-error@-2 {{implicit conversion of Objective-C pointer type 'const A *' to C pointer type 'void *' requires a bridged cast}}
39fbf915f0SRichard Smith// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}}
40fbf915f0SRichard Smith// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'void *'}}
41fbf915f0SRichard Smith#endif
42fbf915f0SRichard Smith  return cv == a;
43fbf915f0SRichard Smith#ifndef NOARC
44fbf915f0SRichard Smith// expected-error@-2 {{implicit conversion of Objective-C pointer type 'A *' to C pointer type 'const void *' requires a bridged cast}}
45fbf915f0SRichard Smith// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}}
46fbf915f0SRichard Smith// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'const void *'}}
47fbf915f0SRichard Smith#endif
48fbf915f0SRichard Smith
49fbf915f0SRichard Smith  // FIXME: Shouldn't these be rejected in ARC mode too?
50fbf915f0SRichard Smith  return ca == cv;
51fbf915f0SRichard Smith  return a == cv;
52fbf915f0SRichard Smith  return ca == v;
53fbf915f0SRichard Smith}
54*35131716SErik Pilkington
55*35131716SErik Pilkington#ifndef NOARC
56*35131716SErik Pilkingtonint testDoublePtr(void *pv, void **ppv, A *__strong* pspa, A *__weak* pwpa, A *__strong** ppspa) {
57*35131716SErik Pilkington  return pv == pspa;
58*35131716SErik Pilkington  return pspa == pv;
59*35131716SErik Pilkington  return pv == pspa;
60*35131716SErik Pilkington  return pv == pwpa;
61*35131716SErik Pilkington  return pspa == pwpa; // expected-error {{comparison of distinct pointer types}}
62*35131716SErik Pilkington  return ppv == pspa; // expected-error {{comparison of distinct pointer types}}
63*35131716SErik Pilkington  return pspa == ppv; // expected-error {{comparison of distinct pointer types}}
64*35131716SErik Pilkington  return pv == ppspa;
65*35131716SErik Pilkington  return ppv == ppspa; // expected-error{{comparison of distinct pointer types}}
66*35131716SErik Pilkington}
67*35131716SErik Pilkington#endif
68