xref: /aosp_15_r20/external/clang/test/SemaObjC/arc-bridged-cast.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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