Author: Valeriy Savchenko Date: 2021-04-07T13:50:01+03:00 New Revision: 77f1e096e8a0a0f37a4c5f8a0bacc7c60f44f0a1
URL: https://github.com/llvm/llvm-project/commit/77f1e096e8a0a0f37a4c5f8a0bacc7c60f44f0a1 DIFF: https://github.com/llvm/llvm-project/commit/77f1e096e8a0a0f37a4c5f8a0bacc7c60f44f0a1.diff LOG: [-Wcompletion-handler] Don't recognize init methods as conventional rdar://75704162 Differential Revision: https://reviews.llvm.org/D99601 Added: Modified: clang/lib/Analysis/CalledOnceCheck.cpp clang/test/SemaObjC/warn-called-once.m Removed: ################################################################################ diff --git a/clang/lib/Analysis/CalledOnceCheck.cpp b/clang/lib/Analysis/CalledOnceCheck.cpp index 9fa8ac30404c3..db094129a9608 100644 --- a/clang/lib/Analysis/CalledOnceCheck.cpp +++ b/clang/lib/Analysis/CalledOnceCheck.cpp @@ -1011,11 +1011,16 @@ class CalledOnceChecker : public ConstStmtVisitor<CalledOnceChecker> { 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 ff2778d4bd0a4..27030dd94a825 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 <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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits