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

Reply via email to