| // RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Loops,debug.ExprInspection -verify %s |
| |
| void clang_analyzer_eval(int); |
| |
| #define nil ((id)0) |
| |
| @protocol NSFastEnumeration |
| - (int)countByEnumeratingWithState:(void *)state objects:(id *)objects count:(unsigned)count; |
| @end |
| |
| @interface NSObject |
| + (instancetype)testObject; |
| @end |
| |
| @interface NSEnumerator <NSFastEnumeration> |
| @end |
| |
| @interface NSArray : NSObject <NSFastEnumeration> |
| - (NSEnumerator *)objectEnumerator; |
| @end |
| |
| @interface NSDictionary : NSObject <NSFastEnumeration> |
| @end |
| |
| @interface NSMutableDictionary : NSDictionary |
| @end |
| |
| @interface NSSet : NSObject <NSFastEnumeration> |
| @end |
| |
| @interface NSPointerArray : NSObject <NSFastEnumeration> |
| @end |
| |
| void test() { |
| id x; |
| for (x in [NSArray testObject]) |
| clang_analyzer_eval(x != nil); // expected-warning{{TRUE}} |
| |
| for (x in [NSMutableDictionary testObject]) |
| clang_analyzer_eval(x != nil); // expected-warning{{TRUE}} |
| |
| for (x in [NSSet testObject]) |
| clang_analyzer_eval(x != nil); // expected-warning{{TRUE}} |
| |
| for (x in [[NSArray testObject] objectEnumerator]) |
| clang_analyzer_eval(x != nil); // expected-warning{{TRUE}} |
| |
| for (x in [NSPointerArray testObject]) |
| clang_analyzer_eval(x != nil); // expected-warning{{UNKNOWN}} |
| } |
| |
| void testWithVarInFor() { |
| for (id x in [NSArray testObject]) |
| clang_analyzer_eval(x != nil); // expected-warning{{TRUE}} |
| for (id x in [NSPointerArray testObject]) |
| clang_analyzer_eval(x != nil); // expected-warning{{UNKNOWN}} |
| } |
| |