// RUN: %clang_cc1 -verify -Wno-deprecated-declarations -Wno-objc-root-class %s

@interface Unrelated
@end

@interface NSObject
+ (id)new;
+ (id)alloc;
- (NSObject *)init;

- (id)retain;  // expected-note{{instance method 'retain' is assumed to return an instance of its receiver type ('NSArray *')}}
- autorelease;

- (id)self;

- (id)copy;
- (id)mutableCopy;

// Do not infer when instance/class mismatches
- (id)newNotInferred;
- (id)alloc;
+ (id)initWithBlarg;
+ (id)self;

// Do not infer when the return types mismatch.
- (Unrelated *)initAsUnrelated;
@end

@interface NSString : NSObject
- (id)init;
- (id)initWithCString:(const char*)string;
@end

@interface NSArray : NSObject
- (unsigned)count;
@end

@interface NSBlah 
@end

@interface NSMutableArray : NSArray
@end

@interface NSBlah ()
+ (Unrelated *)newUnrelated;
@end

void test_inference(void) {
  // Inference based on method family
  __typeof__(([[NSString alloc] init])) *str = (NSString**)0;
  __typeof__(([[[[NSString new] self] retain] autorelease])) *str2 = (NSString **)0;
  __typeof__(([[NSString alloc] initWithCString:"blah"])) *str3 = (NSString**)0;

  // Not inferred
  __typeof__(([[NSString new] copy])) *id1 = (id*)0;

  // Not inferred due to instance/class mismatches
  __typeof__(([[NSString new] newNotInferred])) *id2 = (id*)0;
  __typeof__(([[NSString new] alloc])) *id3 = (id*)0;
  __typeof__(([NSString self])) *id4 = (id*)0;
  __typeof__(([NSString initWithBlarg])) *id5 = (id*)0;

  // Not inferred due to return type mismatch
  __typeof__(([[NSString alloc] initAsUnrelated])) *unrelated = (Unrelated**)0;
  __typeof__(([NSBlah newUnrelated])) *unrelated2 = (Unrelated**)0;

  
  NSArray *arr = [[NSMutableArray alloc] init];
  NSMutableArray *marr = [arr retain]; // expected-warning{{incompatible pointer types initializing 'NSMutableArray *' with an expression of type 'NSArray *'}}
}

@implementation NSBlah
+ (Unrelated *)newUnrelated {
  return (Unrelated *)0;
}
@end

@implementation NSBlah (Cat)
+ (Unrelated *)newUnrelated2 {
  return (Unrelated *)0;
}
@end

@interface A
- (id)initBlah; // expected-note 2{{overridden method is part of the 'init' method family}}
@end

@interface B : A
- (Unrelated *)initBlah; // expected-warning{{method is expected to return an instance of its class type 'B', but is declared to return 'Unrelated *'}}
@end

@interface C : A
@end

@implementation C
- (Unrelated *)initBlah {  // expected-warning{{method is expected to return an instance of its class type 'C', but is declared to return 'Unrelated *'}}
  return (Unrelated *)0;
}
@end

@interface D
+ (id)newBlarg; // expected-note{{overridden method is part of the 'new' method family}}
@end

@interface D ()
+ alloc; // expected-note{{overridden method is part of the 'alloc' method family}}
@end

@implementation D
+ (Unrelated *)newBlarg { // expected-warning{{method is expected to return an instance of its class type 'D', but is declared to return 'Unrelated *'}}
  return (Unrelated *)0;
}

+ (Unrelated *)alloc { // expected-warning{{method is expected to return an instance of its class type 'D', but is declared to return 'Unrelated *'}}
  return (Unrelated *)0;
}
@end

@protocol P1
- (id)initBlah; // expected-note{{overridden method is part of the 'init' method family}}
- (int)initBlarg;
@end

@protocol P2 <P1>
- (int)initBlah; // expected-warning{{protocol method is expected to return an instance of the implementing class, but is declared to return 'int'}}
- (int)initBlarg;
- (int)initBlech;
@end

@interface E
- init;
@end

@implementation E
- init {
  return self;
}
@end

@protocol P3
+ (NSString *)newString;
@end

@interface F<P3>
@end

@implementation F
+ (NSString *)newString { return @"blah"; }
@end

@interface G 
- (id)_ABC_init __attribute__((objc_method_family(init))); // expected-note {{method '_ABC_init' declared here}}
@end

@interface G (Additions)
- (id)_ABC_init2 __attribute__((objc_method_family(init)));
@end

@implementation G (Additions)
- (id)_ABC_init { // expected-warning {{category is implementing a method which will also be implemented by its primary class}}
  return 0;
}
- (id)_ABC_init2 {
  return 0;
}
- (id)_ABC_init3 {
  return 0;
}
@end

// PR12384
@interface Fail @end
@protocol X @end
@implementation Fail
- (id<X>) initWithX // expected-note {{compiler has implicitly changed method 'initWithX' return type}}
{
  return (id)self; // expected-warning {{casting 'Fail *' to incompatible type 'id<X>'}}
}
@end

@interface WeirdNSString : NSString
- (id)initWithCString:(const char*)string, void *blah;
@end

@protocol PMFilterManager
@end

@interface UIViewController : NSObject
@end

@implementation UIViewController
+ (UIViewController<PMFilterManager> *)newFilterViewControllerForType // expected-note {{compiler has implicitly changed method 'newFilterViewControllerForType' return type}}
{
        UIViewController<PMFilterManager> *filterVC;
        return filterVC; // expected-warning {{incompatible pointer types casting 'UIViewController *' to type 'UIViewController<PMFilterManager> *'}}
}
@end
