1 | // RUN: %clang_cc1 -fsyntax-only -fblocks -verify -std=c++11 %s |
2 | // rdar://9293227 |
3 | |
4 | @class NSArray; |
5 | |
6 | void f(NSArray *a) { |
7 | id keys; |
8 | for (int i : a); // expected-error{{selector element type 'int' is not a valid object}} |
9 | for ((id)2 : a); // expected-error {{for range declaration must declare a variable}} |
10 | for (2 : a); // expected-error {{for range declaration must declare a variable}} |
11 | |
12 | for (id thisKey : keys); |
13 | |
14 | for (auto thisKey : keys) { } // expected-warning{{'auto' deduced as 'id' in declaration of 'thisKey'}} |
15 | } |
16 | |
17 | void for_init_stmt() { |
18 | for (id keys; id key : keys) {} // expected-warning{{extension}} expected-error{{not supported}} |
19 | } |
20 | template<typename T> void for_init_stmt_tmpl() { |
21 | for (T keys; id key : keys) {} // expected-warning{{extension}} expected-error{{not supported}} |
22 | } |
23 | template void for_init_stmt_tmpl<id>(); // expected-note {{in instantiation of}} |
24 | |
25 | template<typename Collection> |
26 | void ft(Collection col) { |
27 | for (id x : col) { } |
28 | for (auto x : col) { } |
29 | } |
30 | |
31 | template void ft(NSArray *); |
32 | |
33 | /* // rdar://9072298 */ |
34 | @protocol NSObject @end |
35 | |
36 | @interface NSObject <NSObject> { |
37 | Class isa; |
38 | } |
39 | @end |
40 | |
41 | typedef struct { |
42 | unsigned long state; |
43 | id *itemsPtr; |
44 | unsigned long *mutationsPtr; |
45 | unsigned long extra[5]; |
46 | } NSFastEnumerationState; |
47 | |
48 | @protocol NSFastEnumeration |
49 | |
50 | - (unsigned long)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(unsigned long)len; |
51 | |
52 | @end |
53 | |
54 | int main () |
55 | { |
56 | NSObject<NSFastEnumeration>* collection = 0; |
57 | for (id thing : collection) { } |
58 | |
59 | id array; |
60 | for (int (^b)(void) : array) { |
61 | if (b() == 10000) { |
62 | return 1; |
63 | } |
64 | } |
65 | return 0; |
66 | } |
67 | |
68 | /* rdar://problem/11068137 */ |
69 | @interface Test2 |
70 | @property (assign) id prop; |
71 | @end |
72 | void test2(NSObject<NSFastEnumeration> *collection) { |
73 | Test2 *obj; |
74 | for (obj.prop : collection) { // expected-error {{for range declaration must declare a variable}} |
75 | } |
76 | } |
77 | |
78 | void testErrors(NSArray *array) { |
79 | typedef int fn(int); |
80 | |
81 | for (fn x in array) { } // expected-error{{non-variable declaration in 'for' loop}} |
82 | } |
83 | |