1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar/* RUN: %clang_cc1 -Wall -fsyntax-only -verify -std=c89 -pedantic %s
24d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner */
31fe379f0fa6fbc0a6057e8966253aea2957ca953Anders Carlsson
41fe379f0fa6fbc0a6057e8966253aea2957ca953Anders Carlsson@class NSArray;
51fe379f0fa6fbc0a6057e8966253aea2957ca953Anders Carlsson
64d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattnervoid f(NSArray *a) {
74d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner    id keys;
84d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner    for (int i in a); /* expected-error{{selector element type 'int' is not a valid object}} */
94d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner    for ((id)2 in a); /* expected-error{{selector element is not a valid lvalue}} */
104d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner    for (2 in a); /* expected-error{{selector element is not a valid lvalue}} */
114d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner
124d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner  /* This should be ok, 'thisKey' should be scoped to the loop in question,
134d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner   * and no diagnostics even in pedantic mode should happen.
144d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner   * rdar://6814674
154d00f2a5a9b670cd0d67d640a42dbf7b9f342c59Chris Lattner   */
16bdf3d9ad85ef09544d14db0e848a01c7df9cb028Fariborz Jahanian  for (id thisKey in keys); /* expected-warning {{unused variable 'thisKey'}} */
17bdf3d9ad85ef09544d14db0e848a01c7df9cb028Fariborz Jahanian  for (id thisKey in keys); /* expected-warning {{unused variable 'thisKey'}} */
18d162584991885ab004a02573a73ce06422b921fcChris Lattner}
1961478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
2061478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian/* // rdar://9072298 */
2161478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian@protocol NSObject @end
2261478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
2361478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian@interface NSObject <NSObject> {
2461478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian    Class isa;
2561478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian}
2661478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian@end
2761478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
2861478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahaniantypedef struct {
2961478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian    unsigned long state;
3061478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian    id *itemsPtr;
3161478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian    unsigned long *mutationsPtr;
3261478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian    unsigned long extra[5];
3361478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian} NSFastEnumerationState;
3461478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
3561478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian@protocol NSFastEnumeration
3661478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
3761478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian- (unsigned long)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(unsigned long)len;
3861478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
3961478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian@end
4061478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
4161478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanianint main ()
4261478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian{
4361478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian NSObject<NSFastEnumeration>* collection = ((void*)0);
44bdf3d9ad85ef09544d14db0e848a01c7df9cb028Fariborz Jahanian for (id thing in collection) { } /* expected-warning {{unused variable 'thing'}} */
4561478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
4661478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian return 0;
4761478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian}
4861478065fbcafcf5295bb0fb796c9a92f2d861e0Fariborz Jahanian
4929bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall/* rdar://problem/11068137 */
5029bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall@interface Test2
5129bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall@property (assign) id prop;
5229bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall@end
5329bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCallvoid test2(NSObject<NSFastEnumeration> *collection) {
5429bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall  Test2 *obj;
5529bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall  for (obj.prop in collection) { /* expected-error {{selector element is not a valid lvalue}} */
5629bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall  }
5729bbd1a33edfd3c81c35d5076530c2867a05bddcJohn McCall}
58