[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaObjCXX / foreach.mm
blob03c8395911f459b909ba56361328190755517aa1
1 // RUN: %clang_cc1 -fsyntax-only -fblocks -verify -std=c++11 %s
3 @class NSArray;
5 void f(NSArray *a) {
6     id keys;
7     for (int i : a); // expected-error{{selector element type 'int' is not a valid object}} 
8     for ((id)2 : a);  // expected-error {{for range declaration must declare a variable}}
9     for (2 : a); // expected-error {{for range declaration must declare a variable}}
10   
11   for (id thisKey : keys);
13   for (auto thisKey : keys) { } // expected-warning{{'auto' deduced as 'id' in declaration of 'thisKey'}}
16 void for_init_stmt() {
17   for (id keys; id key : keys) {} // expected-warning{{extension}} expected-error{{not supported}}
19 template<typename T> void for_init_stmt_tmpl() {
20   for (T keys; id key : keys) {} // expected-warning{{extension}} expected-error{{not supported}}
22 template void for_init_stmt_tmpl<id>(); // expected-note {{in instantiation of}}
24 template<typename Collection>
25 void ft(Collection col) {
26   for (id x : col) { }
27   for (auto x : col) { }
30 template void ft(NSArray *);
32 @protocol NSObject @end
34 @interface NSObject <NSObject> {
35     Class isa;
37 @end
39 typedef struct {
40     unsigned long state;
41     id *itemsPtr;
42     unsigned long *mutationsPtr;
43     unsigned long extra[5];
44 } NSFastEnumerationState;
46 @protocol NSFastEnumeration
48 - (unsigned long)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(unsigned long)len;
50 @end
52 int main ()
54  NSObject<NSFastEnumeration>* collection = 0;
55  for (id thing : collection) { }
57  id array;
58  for (int (^b)(void) : array) {
59     if (b() == 10000) {
60         return 1;
61     }
62  }
63  return 0;
66 @interface Test2
67 @property (assign) id prop;
68 @end
69 void test2(NSObject<NSFastEnumeration> *collection) {
70   Test2 *obj;
71   for (obj.prop : collection) { // expected-error {{for range declaration must declare a variable}}
72   }
75 void testErrors(NSArray *array) {
76   typedef int fn(int);
78   for (fn x in array) { } // expected-error{{non-variable declaration in 'for' loop}}