// 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() {
  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}}
}
