diff --git a/clang/lib/Analysis/CalledOnceCheck.cpp b/clang/lib/Analysis/CalledOnceCheck.cpp --- a/clang/lib/Analysis/CalledOnceCheck.cpp +++ b/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; } } diff --git a/clang/test/SemaObjC/warn-called-once.m b/clang/test/SemaObjC/warn-called-once.m --- a/clang/test/SemaObjC/warn-called-once.m +++ b/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