diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index 81cb9da262b9..a52c32f08faf 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -830,8 +830,12 @@ bool ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx, return Res; } -static void ReplaceWithInstancetype(const ObjCMigrateASTConsumer &ASTC, +static void ReplaceWithInstancetype(ASTContext &Ctx, + const ObjCMigrateASTConsumer &ASTC, ObjCMethodDecl *OM) { + if (OM->getReturnType() == Ctx.getObjCInstanceType()) + return; // already has instancetype. + SourceRange R; std::string ClassString; if (TypeSourceInfo *TSInfo = OM->getReturnTypeSourceInfo()) { @@ -893,7 +897,7 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, return; case OIT_Init: if (OM->getReturnType()->isObjCIdType()) - ReplaceWithInstancetype(*this, OM); + ReplaceWithInstancetype(Ctx, *this, OM); return; case OIT_ReturnsSelf: migrateFactoryMethod(Ctx, CDecl, OM, OIT_ReturnsSelf); @@ -914,7 +918,7 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, migrateFactoryMethod(Ctx, CDecl, OM); return; } - ReplaceWithInstancetype(*this, OM); + ReplaceWithInstancetype(Ctx, *this, OM); } static bool TypeIsInnerPointer(QualType T) { @@ -1224,7 +1228,7 @@ void ObjCMigrateASTConsumer::migrateFactoryMethod(ASTContext &Ctx, if (OIT_Family == OIT_ReturnsSelf) ReplaceWithClasstype(*this, OM); else - ReplaceWithInstancetype(*this, OM); + ReplaceWithInstancetype(Ctx, *this, OM); } static bool IsVoidStarType(QualType Ty) { diff --git a/clang/test/ARCMT/objcmt-instancetype-unnecessary-diff.m b/clang/test/ARCMT/objcmt-instancetype-unnecessary-diff.m new file mode 100644 index 000000000000..e250bb0956c0 --- /dev/null +++ b/clang/test/ARCMT/objcmt-instancetype-unnecessary-diff.m @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -objcmt-migrate-instancetype %s -triple x86_64-apple-darwin11 -fobjc-arc -migrate -o %t.remap +// RUN: FileCheck %s -input-file=%t.remap + +// Make sure we don't create an edit unnecessarily. +// CHECK-NOT: instancetype + +@class NSString; +@interface NSDictionary ++(instancetype) dictionaryWithURLEncodedString:(NSString *)urlEncodedString; +@end