diagnoseDistinctPointerComparison(*this, Loc, LHS, RHS,
/*isError*/false);
}
+ // FIXME: If LPtrToVoid, we should presumably convert the LHS rather than
+ // the RHS, but we have test coverage for this behavior.
+ // FIXME: Consider using convertPointersToCompositeType in C++.
if (LHSIsNull && !RHSIsNull) {
Expr *E = LHS.get();
if (getLangOpts().ObjCAutoRefCount)
b = (vp == nil);
b = (nil == vp);
+ // FIXME: Shouldn't these be consistent?
b = (vp == op); // expected-error {{implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}} expected-note {{use __bridge}} expected-note {{use CFBridgingRetain call}}
b = (op == vp);
}
return v == (void *)0;
return x == y;
}
+
+@class A;
+
+int testMixedQualComparisonRules(void *v, const void *cv, A *a, const A *ca) {
+ return cv == ca;
+#ifndef NOARC
+// expected-error@-2 {{implicit conversion of Objective-C pointer type 'const A *' to C pointer type 'const 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 'const void *'}}
+#endif
+ // FIXME: The "to" type in this diagnostic is wrong; we should convert to "const void *".
+ return v == ca;
+#ifndef NOARC
+// expected-error@-2 {{implicit conversion of Objective-C pointer type 'const A *' 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 cv == a;
+#ifndef NOARC
+// expected-error@-2 {{implicit conversion of Objective-C pointer type 'A *' to C pointer type 'const 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 'const void *'}}
+#endif
+
+ // FIXME: Shouldn't these be rejected in ARC mode too?
+ return ca == cv;
+ return a == cv;
+ return ca == v;
+}