From ae5bbfc0d00c89d2d63f37dce89804c4160cf50c Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian <fjahanian@apple.com> Date: Fri, 27 Jul 2012 23:55:46 +0000 Subject: [PATCH] objc-arc: change per Jordy's comments. // rdar://11923822 llvm-svn: 160902 --- clang/lib/Sema/SemaExprObjC.cpp | 27 +++++++++++++------------- clang/test/SemaObjC/arc-bridged-cast.m | 2 +- clang/test/SemaObjC/arc-cf.m | 6 ++++-- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 09f12d7ee29d..20c8e884be09 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -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) diff --git a/clang/test/SemaObjC/arc-bridged-cast.m b/clang/test/SemaObjC/arc-bridged-cast.m index f115c2925582..b5ec36af3838 100644 --- a/clang/test/SemaObjC/arc-bridged-cast.m +++ b/clang/test/SemaObjC/arc-bridged-cast.m @@ -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}:")" diff --git a/clang/test/SemaObjC/arc-cf.m b/clang/test/SemaObjC/arc-cf.m index 8324df66496f..57547208c6c5 100644 --- a/clang/test/SemaObjC/arc-cf.m +++ b/clang/test/SemaObjC/arc-cf.m @@ -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}} }