This revision was automatically updated to reflect the committed changes. Closed by commit rGa00944ebeab1: [clang] 'unused-but-set-variable' warning should not apply to __block objective… (authored by arphaman).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D112850/new/ https://reviews.llvm.org/D112850 Files: clang/lib/Sema/SemaDecl.cpp clang/test/SemaObjC/block-capture-unused-variable.m Index: clang/test/SemaObjC/block-capture-unused-variable.m =================================================================== --- /dev/null +++ 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<P> 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(); +} Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -1944,6 +1944,12 @@ } } + // 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<BlocksAttr>() && Ty->isObjCObjectPointerType()) + return; + auto iter = RefsMinusAssignments.find(VD); if (iter == RefsMinusAssignments.end()) return;
Index: clang/test/SemaObjC/block-capture-unused-variable.m =================================================================== --- /dev/null +++ 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<P> 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(); +} Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -1944,6 +1944,12 @@ } } + // 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<BlocksAttr>() && Ty->isObjCObjectPointerType()) + return; + auto iter = RefsMinusAssignments.find(VD); if (iter == RefsMinusAssignments.end()) return;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits