objc-for.m revision 5d2e4e1f9ed87ea26295e891acf7e5a3b106f194
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.Loops,debug.ExprInspection -verify %s
2
3void clang_analyzer_eval(int);
4
5#define nil ((id)0)
6
7@protocol NSFastEnumeration
8- (int)countByEnumeratingWithState:(void *)state objects:(id *)objects count:(unsigned)count;
9@end
10
11@interface NSObject
12+ (instancetype)testObject;
13@end
14
15@interface NSEnumerator <NSFastEnumeration>
16@end
17
18@interface NSArray : NSObject <NSFastEnumeration>
19- (NSEnumerator *)objectEnumerator;
20@end
21
22@interface NSDictionary : NSObject <NSFastEnumeration>
23@end
24
25@interface NSMutableDictionary : NSDictionary
26@end
27
28@interface NSSet : NSObject <NSFastEnumeration>
29@end
30
31@interface NSPointerArray : NSObject <NSFastEnumeration>
32@end
33
34void test() {
35  id x;
36  for (x in [NSArray testObject])
37    clang_analyzer_eval(x != nil); // expected-warning{{TRUE}}
38
39  for (x in [NSMutableDictionary testObject])
40    clang_analyzer_eval(x != nil); // expected-warning{{TRUE}}
41
42  for (x in [NSSet testObject])
43    clang_analyzer_eval(x != nil); // expected-warning{{TRUE}}
44
45  for (x in [[NSArray testObject] objectEnumerator])
46    clang_analyzer_eval(x != nil); // expected-warning{{TRUE}}
47
48  for (x in [NSPointerArray testObject])
49    clang_analyzer_eval(x != nil); // expected-warning{{UNKNOWN}}
50}
51
52void testWithVarInFor() {
53  for (id x in [NSArray testObject])
54    clang_analyzer_eval(x != nil); // expected-warning{{TRUE}}
55  for (id x in [NSPointerArray testObject])
56    clang_analyzer_eval(x != nil); // expected-warning{{UNKNOWN}}
57}
58
59void testNonNil(id a, id b) {
60  clang_analyzer_eval(a != nil); // expected-warning{{UNKNOWN}}
61  for (id x in a)
62    clang_analyzer_eval(a != nil); // expected-warning{{TRUE}}
63
64  if (b != nil)
65    return;
66  for (id x in b)
67    *(volatile int *)0 = 1; // no-warning
68  clang_analyzer_eval(b != nil); // expected-warning{{FALSE}}
69}
70
71