/* APPLE LOCAL file radar 4531086 */
/* Test for warning on usage of objc2 features on older os's. */
/* { dg-options "-fobjc-abi-version=2 -fobjc-new-property -mmacosx-version-min=10.4" } */
/* { dg-do compile { target *-*-darwin* } } */

#include <objc/objc.h>
#include <objc/Object.h>

@interface Bar : Object
{
  int iVar;
}
@property (assign, setter = MySetter:) int FooBar;  /* { dg-warning "Mac OS X version 10.5 or later is needed for use of property" } */
- (void) MySetter : (int) value;
@end

@implementation Bar
@synthesize FooBar = iVar;
- (void) MySetter : (int) value { iVar = value; }

@end

@interface MyList 
@end

@implementation MyList
- (unsigned int)countByEnumeratingWithState:(struct __objcFastEnumerationState *)state objects:(id *)items count:(unsigned int)stackcount
{
        return 0;
}
- (void)addObject:object {
}

@end

@interface MyList (BasicTest)
- (void)compilerTestAgainst;
@end
void BEGIN();
void INFORLOOP();
void END();
@implementation MyList (BasicTest)
- (void)compilerTestAgainst {

        BEGIN();
        for (id elem in (self))  /* { dg-warning "Mac OS X version 10.5 or later is needed for use of foreach-collection-statement" } */
          if (elem)
            INFORLOOP();

        END();
}
@end


int main(int argc, char *argv[]) {
    Bar *f;
    f.FooBar = 1;

    f.FooBar += 3;

    f.FooBar -= 4;
    return f.FooBar;
}
/* { dg-warning "Mac OS X version 10.5 or later is needed for use of the new objc abi" "" { target *-*-* } 0 } */
