// RUN: %clang_cc1 -fsyntax-only -fobjc-default-synthesize-properties -verify -Wno-objc-root-class %s

@interface NSString @end

@interface NSObject @end

@interface SynthItAll
@property int howMany;
@property (retain) NSString* what;
@end

@implementation SynthItAll
#if !__has_feature(objc_default_synthesize_properties)
@synthesize howMany, what;
#endif
@end


@interface SynthSetter : NSObject
@property (nonatomic) int howMany;  // REM: nonatomic to avoid warnings about only implementing one of the pair
@property (nonatomic, retain) NSString* what;
@end

@implementation SynthSetter
#if !__has_feature(objc_default_synthesize_properties)
@synthesize howMany, what;
#endif

- (int) howMany {
    return self.howMany;
}
// - (void) setHowMany: (int) value

- (NSString*) what {
    return self.what;
}
// - (void) setWhat: (NSString*) value    
@end


@interface SynthGetter : NSObject
@property (nonatomic) int howMany;  // REM: nonatomic to avoid warnings about only implementing one of the pair
@property (nonatomic, retain) NSString* what;
@end

@implementation SynthGetter
#if !__has_feature(objc_default_synthesize_properties)
@synthesize howMany, what;
#endif

// - (int) howMany
- (void) setHowMany: (int) value {
    self.howMany = value;
}

// - (NSString*) what
- (void) setWhat: (NSString*) value {
    if (self.what != value) {
    }
}
@end


@interface SynthNone : NSObject
@property int howMany;
@property (retain) NSString* what;
@end

@implementation SynthNone
#if !__has_feature(objc_default_synthesize_properties)
@synthesize howMany, what;  // REM: Redundant anyway
#endif

- (int) howMany {
    return self.howMany;
}
- (void) setHowMany: (int) value {
    self.howMany = value;
}

- (NSString*) what {
    return self.what;
}
- (void) setWhat: (NSString*) value {
    if (self.what != value) {
    }
}
@end

@protocol TopProtocol
  @property (readonly) id myString;
@end

@interface TopClass <TopProtocol> 
{
  id myString; 
}
@end

@interface SubClass : TopClass <TopProtocol> 
@end

@implementation SubClass @end 

// rdar://7920807
@interface C @end
@interface C (Category)
@property int p; // expected-note 2 {{property declared here}}
@end
@implementation C (Category) // expected-warning {{property 'p' requires method 'p' to be defined}} \
                             // expected-warning {{property 'p' requires method 'setP:' to be defined}}
@end

// Don't complain if a property is already @synthesized by usr.
@interface D
{
}
@property int PROP;
@end

@implementation D
- (int) Meth { return self.PROP; }
#if __has_feature(objc_default_synthesize_properties)
@synthesize PROP=IVAR;
#endif
@end

// rdar://10567333
@protocol MyProtocol 
@property (nonatomic, strong) NSString *requiredString; // expected-note {{property declared here}}

@optional
@property (nonatomic, strong) NSString *optionalString;
@end
 
@interface MyClass <MyProtocol> 
@end
 
@implementation MyClass // expected-warning {{auto property synthesis will not synthesize property declared in a protocol}}
@end
