vsavchenko created this revision. vsavchenko added a reviewer: NoQ. Herald added a subscriber: Charusso. vsavchenko requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This commit makes escapes symmetrical, meaning that having escape before and after the branching, where parameter is not called on one of the paths, will have the same effect. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D98622 Files: clang/lib/Analysis/CalledOnceCheck.cpp clang/test/SemaObjC/warn-called-once.m Index: clang/test/SemaObjC/warn-called-once.m =================================================================== --- clang/test/SemaObjC/warn-called-once.m +++ clang/test/SemaObjC/warn-called-once.m @@ -1130,4 +1130,32 @@ } } +- (void)test_escape_before_branch:(int)cond + withCompletion:(void (^)(void))handler { + if (cond) { + filler(); + } + + void (^copiedHandler)(void) = ^{ + handler(); + }; + + if (cond) { + // no-warning + handler(); + } else { + copiedHandler(); + } +} + +- (void)test_escape_after_branch:(int)cond + withCompletion:(void (^)(void))handler { + if (cond) { + // no-warning + handler(); + } + + escape(handler); +} + @end Index: clang/lib/Analysis/CalledOnceCheck.cpp =================================================================== --- clang/lib/Analysis/CalledOnceCheck.cpp +++ clang/lib/Analysis/CalledOnceCheck.cpp @@ -1367,7 +1367,7 @@ if (auto Index = getIndex(Parameter)) { ParameterStatus &CurrentParamStatus = CurrentState.getStatusFor(*Index); - if (CurrentParamStatus.getKind() == ParameterStatus::NotCalled) { + if (CurrentParamStatus.isErrorStatus()) { CurrentParamStatus = ParameterStatus::Escaped; } }
Index: clang/test/SemaObjC/warn-called-once.m =================================================================== --- clang/test/SemaObjC/warn-called-once.m +++ clang/test/SemaObjC/warn-called-once.m @@ -1130,4 +1130,32 @@ } } +- (void)test_escape_before_branch:(int)cond + withCompletion:(void (^)(void))handler { + if (cond) { + filler(); + } + + void (^copiedHandler)(void) = ^{ + handler(); + }; + + if (cond) { + // no-warning + handler(); + } else { + copiedHandler(); + } +} + +- (void)test_escape_after_branch:(int)cond + withCompletion:(void (^)(void))handler { + if (cond) { + // no-warning + handler(); + } + + escape(handler); +} + @end Index: clang/lib/Analysis/CalledOnceCheck.cpp =================================================================== --- clang/lib/Analysis/CalledOnceCheck.cpp +++ clang/lib/Analysis/CalledOnceCheck.cpp @@ -1367,7 +1367,7 @@ if (auto Index = getIndex(Parameter)) { ParameterStatus &CurrentParamStatus = CurrentState.getStatusFor(*Index); - if (CurrentParamStatus.getKind() == ParameterStatus::NotCalled) { + if (CurrentParamStatus.isErrorStatus()) { CurrentParamStatus = ParameterStatus::Escaped; } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits