From a00944ebeab1b0adbce606cde4d2410fcbb3f440 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Thu, 4 Nov 2021 22:01:33 -0700 Subject: [PATCH] [clang] 'unused-but-set-variable' warning should not apply to __block objective-c pointers The __block Objective-C pointers can be set but not used due to a commonly used lifetime extension pattern in Objective-C. Differential Revision: https://reviews.llvm.org/D112850 --- clang/lib/Sema/SemaDecl.cpp | 6 ++++ .../SemaObjC/block-capture-unused-variable.m | 34 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 clang/test/SemaObjC/block-capture-unused-variable.m diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index f4c0893cfcec..d61570ee6a10 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1944,6 +1944,12 @@ void Sema::DiagnoseUnusedButSetDecl(const VarDecl *VD) { } } + // Don't warn about __block Objective-C pointer variables, as they might + // be assigned in the block but not used elsewhere for the purpose of lifetime + // extension. + if (VD->hasAttr() && Ty->isObjCObjectPointerType()) + return; + auto iter = RefsMinusAssignments.find(VD); if (iter == RefsMinusAssignments.end()) return; diff --git a/clang/test/SemaObjC/block-capture-unused-variable.m b/clang/test/SemaObjC/block-capture-unused-variable.m new file mode 100644 index 000000000000..1d40d9fb106b --- /dev/null +++ b/clang/test/SemaObjC/block-capture-unused-variable.m @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macos11 -fsyntax-only -fobjc-arc -fblocks -verify -Wunused-but-set-variable -Wno-objc-root-class %s + +typedef struct dispatch_queue_s *dispatch_queue_t; + +typedef void (^dispatch_block_t)(void); + +void dispatch_async(dispatch_queue_t queue, dispatch_block_t block); + +extern __attribute__((visibility("default"))) struct dispatch_queue_s _dispatch_main_q; + +id getFoo(); + +@protocol P + +@end + +@interface I + +@end + +void test() { + // no diagnostics + __block id x = getFoo(); + __block id

y = x; + __block I *z = (I *)x; + // diagnose non-block variables + id x2 = getFoo(); // expected-warning {{variable 'x2' set but not used}} + dispatch_async(&_dispatch_main_q, ^{ + x = ((void *)0); + y = x; + z = ((void *)0); + }); + x2 = getFoo(); +} -- 2.34.1