forked from OSchip/llvm-project
Clang `unused-but-set-variable` warnings should not apply to `__attribute__((objc_precise_lifetime))` Objective-C pointers
The `objc_precise_lifetime` attribute is applied to Objective-C pointers to ensure the optimizer does not prematurely release an object under Automatic Reference Counting (ARC). It is a common enough pattern to assign values to these variables but not reference them otherwise, and annotating them with `__unused` is not really correct as they are being used to ensure an object's lifetime. Differential Revision: https://reviews.llvm.org/D120372
This commit is contained in:
parent
19e37a7415
commit
b682616d1f
|
@ -2016,6 +2016,12 @@ void Sema::DiagnoseUnusedButSetDecl(const VarDecl *VD) {
|
||||||
if (VD->hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
|
if (VD->hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Don't warn about Objective-C pointer variables with precise lifetime
|
||||||
|
// semantics; they can be used to ensure ARC releases the object at a known
|
||||||
|
// time, which may mean assignment but no other references.
|
||||||
|
if (VD->hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
|
||||||
|
return;
|
||||||
|
|
||||||
auto iter = RefsMinusAssignments.find(VD);
|
auto iter = RefsMinusAssignments.find(VD);
|
||||||
if (iter == RefsMinusAssignments.end())
|
if (iter == RefsMinusAssignments.end())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
// RUN: %clang_cc1 -triple x86_64-apple-macos11 -fsyntax-only -fobjc-arc -fblocks -verify -Wunused-but-set-variable -Wno-objc-root-class %s
|
||||||
|
|
||||||
|
id getFoo(void);
|
||||||
|
|
||||||
|
void test() {
|
||||||
|
// no diagnostics for objects with precise lifetime semantics.
|
||||||
|
__attribute__((objc_precise_lifetime)) id x;
|
||||||
|
x = getFoo();
|
||||||
|
|
||||||
|
id x2; // expected-warning {{variable 'x2' set but not used}}
|
||||||
|
x2 = getFoo();
|
||||||
|
|
||||||
|
do {
|
||||||
|
__attribute__((objc_precise_lifetime)) id y;
|
||||||
|
y = getFoo();
|
||||||
|
|
||||||
|
id y2; // expected-warning {{variable 'y2' set but not used}}
|
||||||
|
y2 = getFoo();
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
x = ((void *)0);
|
||||||
|
}
|
Loading…
Reference in New Issue