// RUN: rm -rf %t
// RUN: %clang_cc1 -objcmt-migrate-instancetype -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -triple x86_64-apple-darwin11
// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc %s.result

typedef signed char BOOL;
#define nil ((void*) 0)

@interface NSObject
+ (id)alloc;
@end

@interface NSString : NSObject
+ (instancetype)stringWithString:(NSString *)string;
- (instancetype)initWithString:(NSString *)aString;
@end

@implementation NSString : NSObject
+ (instancetype)stringWithString:(NSString *)string { return 0; };
- (instancetype)initWithString:(NSString *)aString { return 0; };
@end

@interface NSArray : NSObject
- (id)objectAtIndex:(unsigned long)index;
- (id)objectAtIndexedSubscript:(int)index;
@end

@interface NSArray (NSArrayCreation)
+ (instancetype)array;
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(const id [])objects count:(unsigned long)cnt;
+ (instancetype)arrayWithObjects:(id)firstObj, ...;
+ (instancetype) arrayWithArray:(NSArray *)array;

- (instancetype)initWithObjects:(const id [])objects count:(unsigned long)cnt;
- (instancetype)initWithObjects:(id)firstObj, ...;
- (instancetype)initWithArray:(NSArray *)array;

- (id)objectAtIndex:(unsigned long)index;
@end

@implementation NSArray (NSArrayCreation)
+ (instancetype)array { return 0; }
+ (instancetype)arrayWithObject:(id)anObject {
  return anObject;
}
+ (instancetype)arrayWithObjects:(const id [])objects count:(unsigned long)cnt { return 0; }
+ (instancetype)arrayWithObjects:(id)firstObj, ... {
  return 0; }
+ (instancetype) arrayWithArray:(NSArray *)array {
  return 0;
}

- (instancetype)initWithObjects:(const id [])objects count:(unsigned long)cnt { return 0; }
- (instancetype)initWithObjects:(id)firstObj, ... { return 0; }
- (instancetype)initWithArray:(NSArray *)array { return 0; }

- (id)objectAtIndex:(unsigned long)index { return 0; }
@end

@interface NSMutableArray : NSArray
- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject;
- (void)setObject:(id)object atIndexedSubscript:(int)index;
@end

@interface NSDictionary : NSObject
- (id)objectForKeyedSubscript:(id)key;
@end

@interface NSDictionary (NSDictionaryCreation)
+ (instancetype)dictionary;
+ (instancetype)dictionaryWithObject:(id)object forKey:(id)key;
+ (instancetype)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
+ (instancetype) dictionaryWithObjectsAndKeys:(id)firstObject, ...;
+ (instancetype)dictionaryWithDictionary:(NSDictionary *)dict;
+ (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;

- (instancetype)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
- (instancetype)initWithObjectsAndKeys:(id)firstObject, ...;
- (instancetype)initWithDictionary:(NSDictionary *)otherDictionary;
- (instancetype)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;

- (id)objectForKey:(id)aKey;
@end

@interface NSMutableDictionary : NSDictionary
- (void)setObject:(id)anObject forKey:(id)aKey;
- (void)setObject:(id)object forKeyedSubscript:(id)key;
@end

@interface NSNumber : NSObject
@end

@interface NSNumber (NSNumberCreation)
+ (NSNumber *)numberWithInt:(int)value;
@end

@implementation NSNumber (NSNumberCreation)
+ (NSNumber *)numberWithInt:(int)value { return 0; }
@end

#define M(x) (x)
#define PAIR(x) @#x, [NSNumber numberWithInt:(x)]
#define TWO(x) ((x), (x))

void foo(void) {
  NSString *str = M([NSString stringWithString:@"foo"]); // expected-warning {{redundant}}
  str = [[NSString alloc] initWithString:@"foo"]; // expected-warning {{redundant}}
  NSArray *arr = [NSArray arrayWithArray:@[str]]; // expected-warning {{redundant}}
  NSDictionary *dict = [NSDictionary dictionaryWithDictionary:@{str: arr}]; // expected-warning {{redundant}}
}
