From d76e1cd8276f377c602b8370c7a61dfa7c34c764 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Sat, 31 Mar 2012 01:34:06 +0000 Subject: [PATCH] [arcmt] When fixing the "unassigned init call" ARC error, make sure to do a nil check for the result of the call. rdar://10950973 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153793 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ARCMigrate/TransUnusedInitDelegate.cpp | 6 +++++- test/ARCMT/init.m | 2 ++ test/ARCMT/init.m.result | 6 ++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/ARCMigrate/TransUnusedInitDelegate.cpp b/lib/ARCMigrate/TransUnusedInitDelegate.cpp index e2aa6ff93c..60ed32aef4 100644 --- a/lib/ARCMigrate/TransUnusedInitDelegate.cpp +++ b/lib/ARCMigrate/TransUnusedInitDelegate.cpp @@ -54,7 +54,11 @@ public: Transaction Trans(Pass.TA); Pass.TA.clearDiagnostic(diag::err_arc_unused_init_message, ME->getExprLoc()); - Pass.TA.insert(ME->getExprLoc(), "self = "); + SourceRange ExprRange = ME->getSourceRange(); + Pass.TA.insert(ExprRange.getBegin(), "if (!(self = "); + std::string retStr = ")) return "; + retStr += getNilString(Pass.Ctx); + Pass.TA.insertAfterToken(ExprRange.getEnd(), retStr); } return true; } diff --git a/test/ARCMT/init.m b/test/ARCMT/init.m index 36e5148476..9dbb1f82b8 100644 --- a/test/ARCMT/init.m +++ b/test/ARCMT/init.m @@ -3,6 +3,8 @@ // RUN: diff %t %s.result // DISABLE: mingw32 +#define nil (void *)0 + @interface NSObject -init; @end diff --git a/test/ARCMT/init.m.result b/test/ARCMT/init.m.result index 9f568d83ed..d7f730083a 100644 --- a/test/ARCMT/init.m.result +++ b/test/ARCMT/init.m.result @@ -3,6 +3,8 @@ // RUN: diff %t %s.result // DISABLE: mingw32 +#define nil (void *)0 + @interface NSObject -init; @end @@ -16,7 +18,7 @@ @implementation A -(id) init { - self = [self init]; + if (!(self = [self init])) return nil; id a; [a init]; a = [[A alloc] init]; @@ -25,7 +27,7 @@ } -(id) init2 { - self = [super init]; + if (!(self = [super init])) return nil; return self; } -- 2.40.0