summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaObjCXX
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2017-03-30 13:48:33 +0000
committerAlex Lorenz <arphaman@gmail.com>2017-03-30 13:48:33 +0000
commitdf42cf101f5420da1fc38df37f308faabe94ca42 (patch)
tree7026daec6d5794d99a80d86ac6b6290cb3bd60c5 /clang/test/SemaObjCXX
parent741dea003e7d97f1e5e6eca2a485784cff923bb2 (diff)
downloadbcm5719-llvm-df42cf101f5420da1fc38df37f308faabe94ca42.tar.gz
bcm5719-llvm-df42cf101f5420da1fc38df37f308faabe94ca42.zip
[ARC][ObjC++] Use ObjC semantic rules for comparisons between a pointer and
an ObjC object pointer When ARC is enabled in Objective-C++, comparisons between a pointer and Objective-C object pointer typically result in errors like this: "invalid operands to a binary expression". This error message can be quite confusing as it doesn't provide a solution to the problem, unlike the non-C++ diagnostic: "implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast" (it also provides fix-its). This commit forces comparisons between pointers and Objective-C object pointers in ARC to use the Objective-C semantic rules to ensure that a better diagnostic is reported. rdar://31103857 Differential Revision: https://reviews.llvm.org/D31177 llvm-svn: 299080
Diffstat (limited to 'clang/test/SemaObjCXX')
-rw-r--r--clang/test/SemaObjCXX/arc-ptr-comparison.mm24
1 files changed, 24 insertions, 0 deletions
diff --git a/clang/test/SemaObjCXX/arc-ptr-comparison.mm b/clang/test/SemaObjCXX/arc-ptr-comparison.mm
new file mode 100644
index 00000000000..8571a817959
--- /dev/null
+++ b/clang/test/SemaObjCXX/arc-ptr-comparison.mm
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -verify %s
+// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin11 -fsyntax-only -verify -DNOARC %s
+#ifdef NOARC
+// expected-no-diagnostics
+#endif
+
+int testObjCComparisonRules(void *v, id x, id y) {
+ return v == x;
+#ifndef NOARC
+// expected-error@-2 {{implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}}
+// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}}
+// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'void *'}}
+#endif
+ return v >= x;
+#ifndef NOARC
+// expected-error@-2 {{implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}}
+// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}}
+// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'void *'}}
+#endif
+ return v == (id)(void *)0; // OK
+ return v == nullptr; // OK
+ return v == (void *)0;
+ return x == y;
+}
OpenPOWER on IntegriCloud