================
@@ -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@-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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits