// RUN: %clang_cc1 -fsyntax-only -verify %s -Wno-unreachable-code
// expected-no-diagnostics

@interface NSObject 
+ alloc;
- init;
@end

@protocol Test
  @property int required;

@optional
  @property int optional;
  @property int optional1;
  @property int optional_preexisting_setter_getter;
  @property (setter = setOptional_preexisting_setter_getter: ,
	     getter = optional_preexisting_setter_getter) int optional_with_setter_getter_attr;
@required
  @property int required1;
@optional
  @property int optional_to_be_defined;
  @property (readonly, getter = optional_preexisting_setter_getter) int optional_getter_attr;
@end

@interface Test : NSObject <Test> {
  int ivar;
  int ivar1;
  int ivar2;
}
@property int required;
@property int optional_to_be_defined;
- (int) optional_preexisting_setter_getter;
- (void) setOptional_preexisting_setter_getter:(int)value;
@end

@implementation Test
@synthesize required = ivar;
@synthesize required1 = ivar1;
@synthesize optional_to_be_defined = ivar2;
- (int) optional_preexisting_setter_getter { return ivar; }
- (void) setOptional_preexisting_setter_getter:(int)value
	   {
		ivar = value;
	   }
- (void) setOptional_getter_attr:(int)value { ivar = value; }
@end

void abort(void);
int main ()
{
	Test *x = [[Test alloc] init];
	/* 1. Test of a required property */
	x.required1 = 100;
  	if (x.required1 != 100)
	  abort ();

	/* 2. Test of a synthesize optional property */
  	x.optional_to_be_defined = 123;
	if (x.optional_to_be_defined != 123)
	  abort ();

	/* 3. Test of optional property with pre-sxisting defined setter/getter */
	x.optional_preexisting_setter_getter = 200;
	if (x.optional_preexisting_setter_getter != 200)
	  abort ();

	/* 4. Test of optional property with setter/getter attribute */
	if (x.optional_with_setter_getter_attr != 200)
	  abort ();
	return 0;

	/* 5. Test of optional property with getter attribute and default setter method. */
	x.optional_getter_attr = 1000;
        if (x.optional_getter_attr != 1000)
	  abort ();

	return 0;
}

