diff --git a/clang/lib/Analysis/CalledOnceCheck.cpp b/clang/lib/Analysis/CalledOnceCheck.cpp index 9fa8ac30404c34..db094129a96086 100644 --- a/clang/lib/Analysis/CalledOnceCheck.cpp +++ b/clang/lib/Analysis/CalledOnceCheck.cpp @@ -1011,11 +1011,16 @@ class CalledOnceChecker : public ConstStmtVisitor { return llvm::None; } + /// Return true if the specified selector represents init method. + static bool isInitMethod(Selector MethodSelector) { + return MethodSelector.getMethodFamily() == OMF_init; + } + /// Return true if the specified selector piece matches conventions. static bool isConventionalSelectorPiece(Selector MethodSelector, unsigned PieceIndex, QualType PieceType) { - if (!isConventional(PieceType)) { + if (!isConventional(PieceType) || isInitMethod(MethodSelector)) { return false; } diff --git a/clang/test/SemaObjC/warn-called-once.m b/clang/test/SemaObjC/warn-called-once.m index ff2778d4bd0a4a..27030dd94a8251 100644 --- a/clang/test/SemaObjC/warn-called-once.m +++ b/clang/test/SemaObjC/warn-called-once.m @@ -13,6 +13,7 @@ @protocol NSObject @end @interface NSObject +- (instancetype)init; - (id)copy; - (id)class; - autorelease; @@ -1235,4 +1236,13 @@ - (void)test_cleanup_2:(int)cond handler(); // expected-warning{{completion handler is called twice}} } +- (void)initWithAdditions:(int)cond + withCompletion:(void (^)(void))handler { + self = [self init]; + if (self) { + escape(handler); + } + // no-warning +} + @end