forked from OSchip/llvm-project
objc-arc: change per Jordy's comments.
// rdar://11923822 llvm-svn: 160902
This commit is contained in:
parent
99b537ef15
commit
ae5bbfc0d0
|
@ -2670,21 +2670,22 @@ namespace {
|
|||
// now we're not going to permit implicit handling of +1 results,
|
||||
// because it's a bit frightening.
|
||||
if (fn->hasAttr<CFReturnsRetainedAttr>())
|
||||
return ACC_invalid; // ACC_plusOne if we start accepting this
|
||||
return Diagnose ? ACC_plusOne
|
||||
: ACC_invalid; // ACC_plusOne if we start accepting this
|
||||
|
||||
// Recognize this specific builtin function, which is used by CFSTR.
|
||||
unsigned builtinID = fn->getBuiltinID();
|
||||
if (builtinID == Builtin::BI__builtin___CFStringMakeConstantString)
|
||||
return ACC_bottom;
|
||||
|
||||
// Otherwise, don't do anything implicit with an unaudited function.
|
||||
if (!fn->hasAttr<CFAuditedTransferAttr>())
|
||||
return ACC_invalid;
|
||||
|
||||
// Otherwise, it's +0 unless it follows the create convention.
|
||||
if (ento::coreFoundation::followsCreateRule(fn))
|
||||
return Diagnose ? ACC_plusOne
|
||||
: ACC_invalid; // ACC_plusOne if we start accepting this
|
||||
|
||||
// Otherwise, don't do anything implicit with an unaudited function.
|
||||
if (!fn->hasAttr<CFAuditedTransferAttr>())
|
||||
return ACC_invalid;
|
||||
|
||||
return ACC_plusZero;
|
||||
}
|
||||
|
@ -2859,15 +2860,15 @@ diagnoseObjCARCConversion(Sema &S, SourceRange castRange,
|
|||
<< castRange
|
||||
<< castExpr->getSourceRange();
|
||||
bool br = S.isKnownName("CFBridgingRelease");
|
||||
bool fCreateRule =
|
||||
ARCCastChecker(S.Context, exprACTC, castACTC, true).Visit(castExpr)
|
||||
== ACC_plusOne;
|
||||
if (!fCreateRule)
|
||||
ACCResult CreateRule =
|
||||
ARCCastChecker(S.Context, exprACTC, castACTC, true).Visit(castExpr);
|
||||
if (CreateRule != ACC_plusOne)
|
||||
{
|
||||
DiagnosticBuilder DiagB = S.Diag(noteLoc, diag::note_arc_bridge);
|
||||
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
|
||||
castType, castExpr, "__bridge ", 0);
|
||||
}
|
||||
if (CreateRule != ACC_plusZero)
|
||||
{
|
||||
DiagnosticBuilder DiagB = S.Diag(br ? castExpr->getExprLoc() : noteLoc,
|
||||
diag::note_arc_bridge_transfer)
|
||||
|
@ -2891,15 +2892,15 @@ diagnoseObjCARCConversion(Sema &S, SourceRange castRange,
|
|||
<< castType
|
||||
<< castRange
|
||||
<< castExpr->getSourceRange();
|
||||
bool fCreateRule =
|
||||
ARCCastChecker(S.Context, exprACTC, castACTC, true).Visit(castExpr)
|
||||
== ACC_plusOne;
|
||||
if (!fCreateRule)
|
||||
ACCResult CreateRule =
|
||||
ARCCastChecker(S.Context, exprACTC, castACTC, true).Visit(castExpr);
|
||||
if (CreateRule != ACC_plusOne)
|
||||
{
|
||||
DiagnosticBuilder DiagB = S.Diag(noteLoc, diag::note_arc_bridge);
|
||||
addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
|
||||
castType, castExpr, "__bridge ", 0);
|
||||
}
|
||||
if (CreateRule != ACC_plusZero)
|
||||
{
|
||||
DiagnosticBuilder DiagB = S.Diag(br ? castExpr->getExprLoc() : noteLoc,
|
||||
diag::note_arc_bridge_retained)
|
||||
|
|
|
@ -38,7 +38,7 @@ void to_cf(id obj) {
|
|||
|
||||
CFTypeRef fixits() {
|
||||
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}} \
|
||||
// expected-note{{use CFBridgingRelease call to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
|
||||
// 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}}
|
||||
// CHECK: fix-it:"{{.*}}":{40:17-40:17}:"CFBridgingRelease("
|
||||
// CHECK: fix-it:"{{.*}}":{40:36-40:36}:")"
|
||||
|
||||
|
|
|
@ -10,7 +10,9 @@ id CFBridgingRelease(CFTypeRef);
|
|||
typedef const struct __CFString *CFStringRef;
|
||||
|
||||
extern CFStringRef CFMakeString0(void);
|
||||
#pragma clang arc_cf_code_audited begin
|
||||
extern CFStringRef CFCreateString0(void);
|
||||
#pragma clang arc_cf_code_audited end
|
||||
void test0() {
|
||||
id x;
|
||||
x = (id) CFMakeString0(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
|
||||
|
@ -22,7 +24,7 @@ extern CFStringRef CFCreateString1(void) __attribute__((cf_returns_retained));
|
|||
void test1() {
|
||||
id x;
|
||||
x = (id) CFMakeString1();
|
||||
x = (id) CFCreateString1(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
|
||||
x = (id) CFCreateString1(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
|
||||
}
|
||||
|
||||
#define CF_AUDIT_BEGIN _Pragma("clang arc_cf_code_audited begin")
|
||||
|
@ -40,6 +42,6 @@ void test2() {
|
|||
id x;
|
||||
x = (id) CFMakeString2();
|
||||
x = (id) CFCreateString2();
|
||||
x = (id) CFMakeString3(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}}
|
||||
x = (id) CFMakeString3(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
|
||||
x = (id) CFCreateString3(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue