/* APPLE LOCAL file radar 4301047 - radar 5245946*/
#include <stdio.h>
#include <string.h>
#include <objc/Protocol.h>
#ifndef __NEXT_RUNTIME__
#include <objc/objc-api.h>
#endif

extern void abort();


@protocol CommonProtocol

-(oneway void)methodCall_On:(in bycopy id)someValue_On;
-(oneway void)methodCall_nO:(bycopy in id)someValue_nO;

-(oneway void)methodCall_Oo:(out bycopy id)someValue_Oo;
-(oneway void)methodCall_oO:(bycopy out id)someValue_oO;

-(oneway void)methodCall_rn:(in const id)someValue_rn;

-(oneway void)methodCall_oOn:(in bycopy out id)someValue_oOn;

@end

@interface ObjCClass <CommonProtocol>
{

}

@end

@implementation ObjCClass
-(oneway void)methodCall_On:(in bycopy id)someValue_On { }
-(oneway void)methodCall_nO:(bycopy in id)someValue_nO { }

-(oneway void)methodCall_Oo:(out bycopy id)someValue_Oo { }
-(oneway void)methodCall_oO:(bycopy out id)someValue_oO { }

-(oneway void)methodCall_rn:(in const id)someValue_rn { }
-(oneway void)methodCall_oOn:(in bycopy out id)someValue_oOn { }
@end

/* APPLE LOCAL radar 4894756 */
/* declaration moved */
struct objc_method_description *meth;
#   if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
struct objc_method_description meth_object;
#endif

int main()
{
	/* APPLE LOCAL radar 4894756 */
        Protocol *proto = @protocol(CommonProtocol);
#   if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
	meth_object = protocol_getMethodDescription (proto,
			@selector(methodCall_On:), YES, YES);
	meth = &meth_object;
#else
        meth = [proto descriptionForInstanceMethod: @selector(methodCall_On:)];
#endif
	if (strcmp (meth->types, "Vv12@0:4On@8"))
	  abort();
#   if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
	meth_object = protocol_getMethodDescription (proto,
		 	@selector(methodCall_nO:), YES, YES);
	meth = &meth_object;
#else
        meth = [proto descriptionForInstanceMethod: @selector(methodCall_nO:)];
#endif
	if (strcmp (meth->types, "Vv12@0:4nO@8"))
	  abort();
#   if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
	meth_object = protocol_getMethodDescription (proto,
			@selector(methodCall_Oo:), YES, YES);
	meth = &meth_object;
#else
        meth = [proto descriptionForInstanceMethod: @selector(methodCall_Oo:)];
#endif
	if (strcmp (meth->types, "Vv12@0:4Oo@8"))
	  abort();
#   if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
	meth_object = protocol_getMethodDescription (proto,
			@selector(methodCall_oO:), YES, YES);
	meth = &meth_object;
#else
        meth = [proto descriptionForInstanceMethod: @selector(methodCall_oO:)];
#endif
	if (strcmp (meth->types, "Vv12@0:4oO@8"))
	  abort();
#   if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
	meth_object = protocol_getMethodDescription (proto,
			@selector(methodCall_rn:), YES, YES);
	meth = &meth_object;
#else
        meth = [proto descriptionForInstanceMethod: @selector(methodCall_rn:)];
#endif
	if (strcmp (meth->types, "Vv12@0:4rn@8"))
	  abort();
#   if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
	meth_object = protocol_getMethodDescription (proto,
			@selector(methodCall_oOn:), YES, YES);	
	meth = &meth_object;
#else
        meth = [proto descriptionForInstanceMethod: @selector(methodCall_oOn:)];
#endif
	if (strcmp (meth->types, "Vv12@0:4oOn@8"))
	  abort();
	return 0;
}
