summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp4
-rw-r--r--clang/test/ARCMT/checking.m4
-rw-r--r--clang/test/ARCMT/nonobjc-to-objc-cast.m.result2
-rw-r--r--clang/test/SemaObjC/arc-type-conversion.m4
-rw-r--r--clang/test/SemaObjC/arc.m18
5 files changed, 24 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index 57e1681fe4c..23c57cf139a 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -3168,7 +3168,9 @@ diagnoseObjCARCConversion(Sema &S, SourceRange castRange,
if ((castACTC == ACTC_coreFoundation && exprACTC == ACTC_retainable &&
ObjCBridgeRelatedAttrFromType(castType, TDNDecl)) ||
(exprACTC == ACTC_coreFoundation && castACTC == ACTC_retainable &&
- ObjCBridgeRelatedAttrFromType(castExprType, TDNDecl)))
+ ObjCBridgeRelatedAttrFromType(castExprType, TDNDecl)) ||
+ (exprACTC ==ACTC_voidPtr && castACTC == ACTC_retainable &&
+ CCK == Sema::CCK_ImplicitConversion))
return;
unsigned srcKind = 0;
diff --git a/clang/test/ARCMT/checking.m b/clang/test/ARCMT/checking.m
index 7815103822a..9dbd222cd26 100644
--- a/clang/test/ARCMT/checking.m
+++ b/clang/test/ARCMT/checking.m
@@ -158,8 +158,8 @@ void * cvt(id arg)
(void)(__autoreleasing id**)voidp_val;
(void)(void*)voidp_val;
(void)(void**)arg; // expected-error {{disallowed}}
- cvt((void*)arg); // expected-error 2 {{requires a bridged cast}} \
- // expected-note 2 {{use __bridge to}} expected-note {{use CFBridgingRelease call}} expected-note {{use CFBridgingRetain call}}
+ cvt((void*)arg); // expected-error 1 {{requires a bridged cast}} \
+ // expected-note 1 {{use __bridge to}} expected-note {{use CFBridgingRetain call}}
cvt(0);
(void)(__strong id**)(0);
return arg; // expected-error {{requires a bridged cast}} expected-note {{use __bridge}} expected-note {{use CFBridgingRetain call}}
diff --git a/clang/test/ARCMT/nonobjc-to-objc-cast.m.result b/clang/test/ARCMT/nonobjc-to-objc-cast.m.result
index ce827ba66aa..645bbb24d4b 100644
--- a/clang/test/ARCMT/nonobjc-to-objc-cast.m.result
+++ b/clang/test/ARCMT/nonobjc-to-objc-cast.m.result
@@ -36,7 +36,7 @@ void f(BOOL b, id p) {
CFUUIDRef _uuid;
NSString *_uuidString = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, _uuid));
_uuidString = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, _uuid));
- _uuidString = CFBridgingRelease(CFRetain(_uuid));
+ _uuidString = CFRetain(_uuid);
}
@implementation NSString (StrExt)
diff --git a/clang/test/SemaObjC/arc-type-conversion.m b/clang/test/SemaObjC/arc-type-conversion.m
index 5cf2cf4b745..ce21a7f18b6 100644
--- a/clang/test/SemaObjC/arc-type-conversion.m
+++ b/clang/test/SemaObjC/arc-type-conversion.m
@@ -16,10 +16,8 @@ void * cvt(id arg)
(void)(void*)voidp_val;
(void)(void**)arg; // expected-error {{cast of an Objective-C pointer to 'void **' is disallowed with ARC}}
cvt((void*)arg); // expected-error {{cast of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}} \
- // expected-error {{implicit conversion of C pointer type 'void *' to Objective-C pointer type 'id' requires a bridged cast}} \
- // expected-note 2 {{use __bridge to convert directly (no change in ownership)}} \
+ // expected-note 1 {{use __bridge to convert directly (no change in ownership)}} \
// expected-note {{use CFBridgingRetain call to make an ARC object available as a +1 'void *'}} \
- // expected-note {{use CFBridgingRelease call to transfer ownership of a +1 'void *' into ARC}}
cvt(0);
(void)(__strong id**)(0);
return arg; // expected-error {{implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}} \
diff --git a/clang/test/SemaObjC/arc.m b/clang/test/SemaObjC/arc.m
index 060af24fa0d..31b47105d52 100644
--- a/clang/test/SemaObjC/arc.m
+++ b/clang/test/SemaObjC/arc.m
@@ -285,7 +285,7 @@ void test11(id op, void *vp) {
b = (nil == vp);
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); // expected-error {{implicit conversion of C pointer type 'void *' to Objective-C pointer type 'id' requires a bridged cast}} expected-note {{use __bridge}} expected-note {{use CFBridgingRelease call}}
+ b = (op == vp);
}
void test12(id collection) {
@@ -782,3 +782,19 @@ void foo(NSArray *array) {
}
}
}
+
+// rdar://16627903
+extern void abort();
+#define TKAssertEqual(a, b) do{\
+ __typeof(a) a_res = (a);\
+ __typeof(b) b_res = (b);\
+ if ((a_res) != (b_res)) {\
+ abort();\
+ }\
+}while(0)
+
+int main() {
+ id object;
+ TKAssertEqual(object, nil);
+ TKAssertEqual(object, (id)nil);
+}
OpenPOWER on IntegriCloud