From: Fariborz Jahanian Date: Mon, 19 Aug 2013 22:00:50 +0000 (+0000) Subject: ObjectiveC migrator: Start inserting X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3abb729514e871b46e0f03855fd686009f3b22b9;p=clang ObjectiveC migrator: Start inserting CF_IMPLICIT_BRIDGING_ENABLE/CF_IMPLICIT_BRIDGING_DISABLED pair. wip. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188714 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index cbe235582d..ab2d7eac49 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -791,23 +791,45 @@ AuditedType (QualType AT) { void ObjCMigrateASTConsumer::migrateCFFunctions( ASTContext &Ctx, const FunctionDecl *FuncDecl) { + if (FuncDecl->hasAttr()) { + assert(CFFunctionIBCandidates.empty() && + "Cannot have audited functions inside user " + "provided CF_IMPLICIT_BRIDGING_ENABLE"); + return; + } + // Finction must be annotated first. bool Audited = migrateAddFunctionAnnotation(Ctx, FuncDecl); if (Audited) CFFunctionIBCandidates.push_back(FuncDecl); + else if (!CFFunctionIBCandidates.empty()) { + if (!Ctx.Idents.get("CF_IMPLICIT_BRIDGING_ENABLED").hasMacroDefinition()) { + CFFunctionIBCandidates.clear(); + return; + } + // Insert CF_IMPLICIT_BRIDGING_ENABLE/CF_IMPLICIT_BRIDGING_DISABLED + const FunctionDecl *FirstFD = CFFunctionIBCandidates[0]; + const FunctionDecl *LastFD = + CFFunctionIBCandidates[CFFunctionIBCandidates.size()-1]; + const char *PragmaString = "\nCF_IMPLICIT_BRIDGING_ENABLED\n"; + edit::Commit commit(*Editor); + commit.insertBefore(FirstFD->getLocStart(), PragmaString); + PragmaString = "\nCF_IMPLICIT_BRIDGING_DISABLED\n"; + commit.insertAfterToken(LastFD->getLocEnd(), PragmaString); + Editor->commit(commit); + + CFFunctionIBCandidates.clear(); + } + // FIXME. Also must insert CF_IMPLICIT_BRIDGING_ENABLE/CF_IMPLICIT_BRIDGING_DISABLED + // when leaving current file. } bool ObjCMigrateASTConsumer::migrateAddFunctionAnnotation( ASTContext &Ctx, const FunctionDecl *FuncDecl) { - // Check that if it is already under CF_IMPLICIT_BRIDGING_ENABLE - // and do nothing. FIXME. This may have to go to the caller. - if (FuncDecl->hasAttr()) - return false; if (FuncDecl->hasBody()) return false; CallEffects CE = CallEffects::getEffect(FuncDecl); - if (!FuncDecl->getAttr() && !FuncDecl->getAttr()) { RetEffect Ret = CE.getReturnValue(); @@ -838,16 +860,15 @@ bool ObjCMigrateASTConsumer::migrateAddFunctionAnnotation( if (AE == DecRefMsg /*NSConsumed annotated*/ || AE == DecRef /*CFConsumed annotated*/) continue; - if (AE != DoNothing) + + if (AE != DoNothing && AE != MayEscape) return false; const ParmVarDecl *pd = *pi; QualType AT = pd->getType(); if (!AuditedType(AT)) return false; } - // At this point, function is audited. - // FIXME. for now return false. - return false; + return true; } void ObjCMigrateASTConsumer::migrateObjCMethodDeclAnnotation(