blob: aaa03fe9a9fa52bff7417bbd5855b64c2e0eaee3 [file] [log] [blame]
/* APPLE LOCAL file 4547045 */
/* Execution check for foreach. */
/* { dg-options "-mmacosx-version-min=10.5 -framework Foundation -fobjc-exceptions" } */
/* { dg-do run } */
#include <Foundation/Foundation.h>
@interface Block : NSObject {
@public
unsigned _address;
unsigned _age;
}
@end
@implementation Block
@end
extern void abort ();
#define ITER 10000
#define BREAK_ITER 5000
#define MOD 100
int countByIterating(id collection, NSSet *set) {
unsigned objectCount = 0;
for (Block *block in collection) {
++objectCount;
}
return objectCount;
}
int countByIteratingAndBreak(id collection, NSSet *set) {
unsigned objectCount = 0;
for (Block *block in collection) {
++objectCount;
if (objectCount == BREAK_ITER)
break;
}
return objectCount;
}
static int res = 0;
int countByIteratingAndMore(id collection, NSSet *set) {
unsigned objectCount = 0;
for (Block *block in collection) {
++objectCount;
if (objectCount % MOD == 0)
res++;
else
continue;
}
return objectCount;
}
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSMutableArray *array = [NSMutableArray array];
unsigned i;
for (i = 0; i < ITER; ++i) {
Block* block = [[Block new] autorelease];
block->_address = i;
[array addObject:block];
}
NSSet *set = [NSSet setWithArray:array];
if (countByIterating(set, set) != ITER)
abort ();
if (countByIterating(array, set) != ITER)
abort ();
if (countByIteratingAndBreak(set, set) != BREAK_ITER)
abort ();
if (countByIteratingAndBreak(array, set) != BREAK_ITER)
abort ();
if (countByIteratingAndMore(set, set) != ITER)
abort ();
if (countByIteratingAndMore(array, set) != ITER)
abort ();
if (res != 200)
abort ();
[pool drain];
return 0;
}