1 // RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Loops,debug.ExprInspection -verify %s 2 3 void 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 34 void 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 52 void 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 59