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