[clang] [alpha.webkit.UnretainedLocalVarsChecker] Treat the collection of a fast enumeration as the origin of its element (PR #230818)
Balázs Benics via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 10 13:00:33 PDT 2026
================
@@ -574,6 +574,91 @@ void ns() {
}
+namespace fast_enumeration {
+
+NSArray *provideArray();
+
+void iterateLocal() {
+ RetainPtr<NSArray> array = provideArray();
+ for (SomeObj *obj in array.get())
+ [obj doWork];
+}
+
+void iterateLocalInNestedScope() {
+ RetainPtr<NSArray> array = provideArray();
+ {
+ for (SomeObj *obj in array.get()) {
+ for (SomeObj *otherObj in array.get())
+ [otherObj doWork];
+ [obj doWork];
+ }
+ }
+}
+
+void iterateLocalWithRangeBasedFor() {
+ RetainPtr<NSArray> array = provideArray();
+ for (SomeObj *obj : array.get())
+ [obj doWork];
+}
+
+void iterateLocalWithId() {
+ RetainPtr<NSArray> array = provideArray();
+ for (id obj in array.get())
+ [obj doWork];
+}
+
+void iterateLocalClearedInBody() {
+ RetainPtr<NSArray> array = provideArray();
+ for (SomeObj *obj in array.get()) {
+ // expected-warning at -1{{Local variable 'obj' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}}
+ array = nullptr;
+ [obj doWork];
+ }
+}
+
+void iterateLocalClearedAfterLoop() {
+ RetainPtr<NSArray> array = provideArray();
+ for (SomeObj *obj in array.get())
+ [obj doWork];
+ array = nullptr;
+}
+
+void iterateParam(NSArray *array) {
+ for (SomeObj *obj in array)
+ [obj doWork];
+}
+
+void iterateParamReassigned(NSArray *array) {
+ for (SomeObj *obj in array) {
----------------
steakhal wrote:
I don't think this matching works for structured-bindings declaring one or multiple binding decls.
```c++
for (auto [obj] in array) {
```
https://github.com/llvm/llvm-project/pull/230818
More information about the cfe-commits
mailing list