Skip to content

Commit 226459e

Browse files
author
Fariborz Jahanian
committed
objc-arc: When objects with known CF semantics are assigned to
retainable types in arc, only suggest CFBridgingRelease/ CFBridgingRetain and not the confusing __bridge casts. // rdar://11923822 llvm-svn: 160839
1 parent abc13af commit 226459e

File tree

10 files changed

+59
-93
lines changed

10 files changed

+59
-93
lines changed

clang/lib/Sema/SemaExprObjC.cpp

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2918,19 +2918,12 @@ diagnoseObjCARCConversion(Sema &S, SourceRange castRange,
29182918
<< castRange
29192919
<< castExpr->getSourceRange();
29202920
bool br = S.isKnownName("CFBridgingRelease");
2921-
{
2922-
DiagnosticBuilder DiagB = S.Diag(noteLoc, diag::note_arc_bridge);
2923-
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
2924-
castType, castExpr, "__bridge ", 0);
2925-
}
2926-
{
2927-
DiagnosticBuilder DiagB = S.Diag(br ? castExpr->getExprLoc() : noteLoc,
2928-
diag::note_arc_bridge_transfer)
2929-
<< castExprType << br;
2930-
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
2931-
castType, castExpr, "__bridge_transfer ",
2932-
br ? "CFBridgingRelease" : 0);
2933-
}
2921+
DiagnosticBuilder DiagB = S.Diag(br ? castExpr->getExprLoc() : noteLoc,
2922+
diag::note_arc_bridge_transfer)
2923+
<< castExprType << br;
2924+
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
2925+
castType, castExpr, "__bridge_transfer ",
2926+
br ? "CFBridgingRelease" : 0);
29342927

29352928
return;
29362929
}
@@ -2946,20 +2939,12 @@ diagnoseObjCARCConversion(Sema &S, SourceRange castRange,
29462939
<< castType
29472940
<< castRange
29482941
<< castExpr->getSourceRange();
2949-
2950-
{
2951-
DiagnosticBuilder DiagB = S.Diag(noteLoc, diag::note_arc_bridge);
2952-
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
2953-
castType, castExpr, "__bridge ", 0);
2954-
}
2955-
{
2956-
DiagnosticBuilder DiagB = S.Diag(br ? castExpr->getExprLoc() : noteLoc,
2957-
diag::note_arc_bridge_retained)
2958-
<< castType << br;
2959-
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
2960-
castType, castExpr, "__bridge_retained ",
2961-
br ? "CFBridgingRetain" : 0);
2962-
}
2942+
DiagnosticBuilder DiagB = S.Diag(br ? castExpr->getExprLoc() : noteLoc,
2943+
diag::note_arc_bridge_retained)
2944+
<< castType << br;
2945+
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
2946+
castType, castExpr, "__bridge_retained ",
2947+
br ? "CFBridgingRetain" : 0);
29632948

29642949
return;
29652950
}

clang/test/ARCMT/checking.m

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ void test1(A *a, BOOL b, struct UnsafeS *unsafeS) {
101101

102102
CFStringRef cfstr;
103103
NSString *str = (NSString *)cfstr; // expected-error {{cast of C pointer type 'CFStringRef' (aka 'const struct __CFString *') to Objective-C pointer type 'NSString *' requires a bridged cast}} \
104-
// expected-note {{use __bridge to convert directly (no change in ownership)}} \
105104
// expected-note {{use CFBridgingRelease call to transfer ownership of a +1 'CFStringRef' (aka 'const struct __CFString *') into ARC}} \
106105
str = (NSString *)kUTTypePlainText;
107106
str = b ? kUTTypeRTF : kUTTypePlainText;
@@ -160,10 +159,10 @@ - (void) noninit {
160159
(void)(void*)voidp_val;
161160
(void)(void**)arg; // expected-error {{disallowed}}
162161
cvt((void*)arg); // expected-error 2 {{requires a bridged cast}} \
163-
// expected-note 2 {{use __bridge to}} expected-note {{use CFBridgingRelease call}} expected-note {{use CFBridgingRetain call}}
162+
expected-note {{use CFBridgingRelease call}} expected-note {{use CFBridgingRetain call}}
164163
cvt(0);
165164
(void)(__strong id**)(0);
166-
return arg; // expected-error {{requires a bridged cast}} expected-note {{use __bridge}} expected-note {{use CFBridgingRetain call}}
165+
return arg; // expected-error {{requires a bridged cast}} expected-note {{use CFBridgingRetain call}}
167166
}
168167

169168

clang/test/ARCMT/no-canceling-bridge-to-bridge-cast.m

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,12 @@ - (void) Meth {
2424
NSString *result;
2525

2626
result = (id) CFRetain([NSString stringWithFormat:@"PBXLoopMode"]); // expected-error {{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \
27-
// expected-note {{use __bridge to convert directly (no change in ownership)}} \
2827
// expected-note {{use CFBridgingRelease call to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
2928

3029
result = (id) CFRetain((id)((objc_format))); // expected-error {{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \
31-
// expected-note {{use __bridge to convert directly (no change in ownership)}} \
3230
// expected-note {{use CFBridgingRelease call to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
3331

3432
result = (id) CFRetain((id)((cf_format))); // expected-error {{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \
35-
// expected-note {{use __bridge to convert directly (no change in ownership)}} \
3633
// expected-note {{use CFBridgingRelease call to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
3734

3835
result = (id) CFRetain((CFTypeRef)((objc_format)));

clang/test/ARCMT/nonobjc-to-objc-cast-2.m

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,21 @@ -(id)string {
2929
}
3030
-(id)newString {
3131
return sref; // expected-error {{implicit conversion of C pointer type 'CFStringRef' (aka 'const struct __CFString *') to Objective-C pointer type 'id' requires a bridged cast}} \
32-
// expected-note{{use __bridge to convert directly (no change in ownership)}} \
3332
// expected-note{{use CFBridgingRelease call to transfer ownership of a +1 'CFStringRef' (aka 'const struct __CFString *') into ARC}}
3433
}
3534
@end
3635

3736
void f(BOOL b) {
3837
CFStringRef cfstr;
3938
NSString *str = (NSString *)cfstr; // expected-error {{cast of C pointer type 'CFStringRef' (aka 'const struct __CFString *') to Objective-C pointer type 'NSString *' requires a bridged cast}} \
40-
// expected-note{{use __bridge to convert directly (no change in ownership)}} \
4139
// expected-note{{use CFBridgingRelease call to transfer ownership of a +1 'CFStringRef' (aka 'const struct __CFString *') into ARC}}
42-
void *vp = str; // expected-error {{requires a bridged cast}} expected-note {{use CFBridgingRetain call}} expected-note {{use __bridge}}
40+
void *vp = str; // expected-error {{requires a bridged cast}} expected-note {{use CFBridgingRetain call}}
4341
}
4442

4543
void f2(NSString *s) {
4644
CFStringRef ref;
4745
ref = [(CFStringRef)[s string] retain]; // expected-error {{cast of Objective-C pointer type 'id' to C pointer type 'CFStringRef' (aka 'const struct __CFString *') requires a bridged cast}} \
4846
// expected-error {{bad receiver type 'CFStringRef' (aka 'const struct __CFString *')}} \
49-
// expected-note{{use __bridge to convert directly (no change in ownership)}} \
5047
// expected-note{{use CFBridgingRetain call to make an ARC object available as a +1 'CFStringRef' (aka 'const struct __CFString *')}}
5148
}
5249

clang/test/SemaObjC/arc-bridged-cast.m

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,30 +38,22 @@ void to_cf(id obj) {
3838

3939
CFTypeRef fixits() {
4040
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-
// expected-note{{use __bridge to convert directly (no change in ownership)}} \
4241
// expected-note{{use CFBridgingRelease call to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
43-
// CHECK: fix-it:"{{.*}}":{40:14-40:14}:"__bridge "
4442
// CHECK: fix-it:"{{.*}}":{40:17-40:17}:"CFBridgingRelease("
4543
// CHECK: fix-it:"{{.*}}":{40:36-40:36}:")"
4644

4745
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}} \
48-
// expected-note{{use __bridge to convert directly (no change in ownership)}} \
4946
// expected-note{{use CFBridgingRetain call to make an ARC object available as a +1 'CFTypeRef' (aka 'const void *')}}
50-
// CHECK: fix-it:"{{.*}}":{47:20-47:20}:"__bridge "
51-
// CHECK: fix-it:"{{.*}}":{47:30-47:30}:"CFBridgingRetain("
52-
// CHECK: fix-it:"{{.*}}":{47:47-47:47}:")"
47+
// CHECK: fix-it:"{{.*}}":{45:30-45:30}:"CFBridgingRetain("
48+
// CHECK: fix-it:"{{.*}}":{45:47-45:47}:")"
5349

5450
return (obj1); // expected-error{{implicit conversion of Objective-C pointer type 'id' to C pointer type 'CFTypeRef' (aka 'const void *') requires a bridged cast}} \
55-
// expected-note{{use __bridge to convert directly (no change in ownership)}} \
5651
// expected-note{{use CFBridgingRetain call to make an ARC object available as a +1 'CFTypeRef' (aka 'const void *')}}
57-
// CHECK: fix-it:"{{.*}}":{54:10-54:10}:"(__bridge CFTypeRef)"
58-
// CHECK: fix-it:"{{.*}}":{54:10-54:10}:"CFBridgingRetain"
52+
// CHECK: fix-it:"{{.*}}":{50:10-50:10}:"CFBridgingRetain"
5953
}
6054

6155
CFTypeRef fixitsWithSpace(id obj) {
6256
return(obj); // expected-error{{implicit conversion of Objective-C pointer type 'id' to C pointer type 'CFTypeRef' (aka 'const void *') requires a bridged cast}} \
63-
// expected-note{{use __bridge to convert directly (no change in ownership)}} \
6457
// expected-note{{use CFBridgingRetain call to make an ARC object available as a +1 'CFTypeRef' (aka 'const void *')}}
65-
// CHECK: fix-it:"{{.*}}":{62:9-62:9}:"(__bridge CFTypeRef)"
66-
// CHECK: fix-it:"{{.*}}":{62:9-62:9}:" CFBridgingRetain"
58+
// CHECK: fix-it:"{{.*}}":{56:9-56:9}:" CFBridgingRetain"
6759
}

clang/test/SemaObjC/arc-cf.m

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@
1313
extern CFStringRef CFCreateString0(void);
1414
void test0() {
1515
id x;
16-
x = (id) CFMakeString0(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
17-
x = (id) CFCreateString0(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
16+
x = (id) CFMakeString0(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
17+
x = (id) CFCreateString0(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
1818
}
1919

2020
extern CFStringRef CFMakeString1(void) __attribute__((cf_returns_not_retained));
2121
extern CFStringRef CFCreateString1(void) __attribute__((cf_returns_retained));
2222
void test1() {
2323
id x;
2424
x = (id) CFMakeString1();
25-
x = (id) CFCreateString1(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
25+
x = (id) CFCreateString1(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
2626
}
2727

2828
#define CF_AUDIT_BEGIN _Pragma("clang arc_cf_code_audited begin")
@@ -40,6 +40,6 @@ void test2() {
4040
id x;
4141
x = (id) CFMakeString2();
4242
x = (id) CFCreateString2();
43-
x = (id) CFMakeString3(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
44-
x = (id) CFCreateString3(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
43+
x = (id) CFMakeString3(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
44+
x = (id) CFCreateString3(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
4545
}

clang/test/SemaObjC/arc-type-conversion.m

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@
1717
(void)(void**)arg; // expected-error {{cast of an Objective-C pointer to 'void **' is disallowed with ARC}}
1818
cvt((void*)arg); // expected-error {{cast of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}} \
1919
// expected-error {{implicit conversion of C pointer type 'void *' to Objective-C pointer type 'id' requires a bridged cast}} \
20-
// expected-note 2 {{use __bridge to convert directly (no change in ownership)}} \
2120
// expected-note {{use CFBridgingRetain call to make an ARC object available as a +1 'void *'}} \
2221
// expected-note {{use CFBridgingRelease call to transfer ownership of a +1 'void *' into ARC}}
2322
cvt(0);
2423
(void)(__strong id**)(0);
2524
return arg; // expected-error {{implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast}} \
26-
// expected-note {{use __bridge to convert directly (no change in ownership)}} \
2725
// expected-note {{use CFBridgingRetain call to make an ARC object available as a +1 'void *'}}
2826
}
2927

0 commit comments

Comments
 (0)