1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -verify %s 2*67e74705SXin Li// RUN: not %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s 3*67e74705SXin Li 4*67e74705SXin Litypedef const void *CFTypeRef; 5*67e74705SXin LiCFTypeRef CFBridgingRetain(id X); 6*67e74705SXin Liid CFBridgingRelease(CFTypeRef); 7*67e74705SXin Litypedef const struct __CFString *CFStringRef; 8*67e74705SXin Li 9*67e74705SXin Li@interface NSString 10*67e74705SXin Li@end 11*67e74705SXin Li 12*67e74705SXin LiCFTypeRef CFCreateSomething(); 13*67e74705SXin LiCFStringRef CFCreateString(); 14*67e74705SXin LiCFTypeRef CFGetSomething(); 15*67e74705SXin LiCFStringRef CFGetString(); 16*67e74705SXin Li 17*67e74705SXin Liid CreateSomething(); 18*67e74705SXin LiNSString *CreateNSString(); 19*67e74705SXin Li 20*67e74705SXin Livoid from_cf() { 21*67e74705SXin Li id obj1 = (__bridge_transfer id)CFCreateSomething(); 22*67e74705SXin Li id obj2 = (__bridge_transfer NSString*)CFCreateString(); 23*67e74705SXin Li (__bridge int*)CFCreateSomething(); // expected-error{{incompatible types casting 'CFTypeRef' (aka 'const void *') to 'int *' with a __bridge cast}} 24*67e74705SXin Li id obj3 = (__bridge id)CFGetSomething(); 25*67e74705SXin Li id obj4 = (__bridge NSString*)CFGetString(); 26*67e74705SXin Li} 27*67e74705SXin Li 28*67e74705SXin Livoid to_cf(id obj) { 29*67e74705SXin Li CFTypeRef cf1 = (__bridge_retained CFTypeRef)CreateSomething(); 30*67e74705SXin Li CFStringRef cf2 = (__bridge_retained CFStringRef)CreateNSString(); 31*67e74705SXin Li CFTypeRef cf3 = (__bridge CFTypeRef)CreateSomething(); 32*67e74705SXin Li CFStringRef cf4 = (__bridge CFStringRef)CreateNSString(); 33*67e74705SXin Li 34*67e74705SXin Li // rdar://problem/9629566 - temporary workaround 35*67e74705SXin Li CFTypeRef cf5 = (__bridge_retain CFTypeRef)CreateSomething(); // expected-error {{unknown cast annotation __bridge_retain; did you mean __bridge_retained?}} 36*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{35:20-35:35}:"__bridge_retained" 37*67e74705SXin Li} 38*67e74705SXin Li 39*67e74705SXin LiCFTypeRef fixits() { 40*67e74705SXin Li id obj1 = (id)CFCreateSomething(); // expected-error{{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \ 41*67e74705SXin Li // expected-note{{use __bridge to convert directly (no change in ownership)}} expected-note{{use CFBridgingRelease call to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}} 42*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{40:17-40:17}:"CFBridgingRelease(" 43*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{40:36-40:36}:")" 44*67e74705SXin Li 45*67e74705SXin Li CFTypeRef cf1 = (CFTypeRef)CreateSomething(); // expected-error{{cast of Objective-C pointer type 'id' to C pointer type 'CFTypeRef' (aka 'const void *') requires a bridged cast}} \ 46*67e74705SXin Li // expected-note{{use __bridge to convert directly (no change in ownership)}} \ 47*67e74705SXin Li // expected-note{{use CFBridgingRetain call to make an ARC object available as a +1 'CFTypeRef' (aka 'const void *')}} 48*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{45:30-45:30}:"CFBridgingRetain(" 49*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{45:47-45:47}:")" 50*67e74705SXin Li 51*67e74705SXin Li return (obj1); // expected-error{{implicit conversion of Objective-C pointer type 'id' to C pointer type 'CFTypeRef' (aka 'const void *') requires a bridged cast}} \ 52*67e74705SXin Li // expected-note{{use __bridge to convert directly (no change in ownership)}} \ 53*67e74705SXin Li // expected-note{{use CFBridgingRetain call to make an ARC object available as a +1 'CFTypeRef' (aka 'const void *')}} 54*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{51:10-51:10}:"(__bridge CFTypeRef)" 55*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{51:10-51:10}:"CFBridgingRetain" 56*67e74705SXin Li} 57*67e74705SXin Li 58*67e74705SXin LiCFTypeRef fixitsWithSpace(id obj) { 59*67e74705SXin Li return(obj); // expected-error{{implicit conversion of Objective-C pointer type 'id' to C pointer type 'CFTypeRef' (aka 'const void *') requires a bridged cast}} \ 60*67e74705SXin Li // expected-note{{use __bridge to convert directly (no change in ownership)}} \ 61*67e74705SXin Li // expected-note{{use CFBridgingRetain call to make an ARC object available as a +1 'CFTypeRef' (aka 'const void *')}} 62*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{59:9-59:9}:"(__bridge CFTypeRef)" 63*67e74705SXin Li // CHECK: fix-it:"{{.*}}":{59:9-59:9}:" CFBridgingRetain" 64*67e74705SXin Li} 65*67e74705SXin Li 66*67e74705SXin Li// rdar://problem/20107345 67*67e74705SXin Litypedef const struct __attribute__((objc_bridge(id))) __CFAnnotatedObject *CFAnnotatedObjectRef; 68*67e74705SXin LiCFAnnotatedObjectRef CFGetAnnotated(); 69*67e74705SXin Li 70*67e74705SXin Livoid testObjCBridgeId() { 71*67e74705SXin Li id obj; 72*67e74705SXin Li obj = (__bridge id)CFGetAnnotated(); 73*67e74705SXin Li obj = (__bridge NSString*)CFGetAnnotated(); 74*67e74705SXin Li obj = (__bridge_transfer id)CFGetAnnotated(); 75*67e74705SXin Li obj = (__bridge_transfer NSString*)CFGetAnnotated(); 76*67e74705SXin Li 77*67e74705SXin Li CFAnnotatedObjectRef ref; 78*67e74705SXin Li ref = (__bridge CFAnnotatedObjectRef) CreateSomething(); 79*67e74705SXin Li ref = (__bridge CFAnnotatedObjectRef) CreateNSString(); 80*67e74705SXin Li ref = (__bridge_retained CFAnnotatedObjectRef) CreateSomething(); 81*67e74705SXin Li ref = (__bridge_retained CFAnnotatedObjectRef) CreateNSString(); 82*67e74705SXin Li} 83*67e74705SXin Li 84*67e74705SXin Li// rdar://20113785 85*67e74705SXin Litypedef const struct __attribute__((objc_bridge(UIFont))) __CTFont * CTFontRef; 86*67e74705SXin Li 87*67e74705SXin Liid testObjCBridgeUnknownTypeToId(CTFontRef font) { 88*67e74705SXin Li id x = (__bridge id)font; 89*67e74705SXin Li return x; 90*67e74705SXin Li} 91*67e74705SXin Li 92