blob: e41181209e4abc713db9f0118b8708341aefe420 [file] [log] [blame]
/*
* Contributed by Nicola Pero <nicola@brainstorm.co.uk>
* Wed Feb 28 12:27:03 CET 2001
*/
/*
* This test contains some no-op code which is needed to keep it
* compile on broken gcc 3.x. Anyway, the no-op code does not
* interfere with what we are testing, which is that the `bycopy'
* keyword generates the _F_BYCOPY qualifier for the return type. */
#include <objc/objc.h>
/* APPLE LOCAL radar 4894756 */
#include "Object2.h"
#include <objc/Protocol.h>
#ifndef __NEXT_RUNTIME__
#include <objc/encoding.h>
#endif
#include "next_mapping.h"
@protocol MyProtocol
+ (bycopy id<MyProtocol>) bycopyMethod;
@end
/* This no-op class to keep it compile under broken gcc 3.x */
@interface MyObject : Object <MyProtocol>
@end
@implementation MyObject
+ (bycopy id<MyProtocol>) bycopyMethod
{
return [MyObject alloc];
}
@end
int main (void)
{
struct objc_method_description *method;
const char *method_types;
unsigned qualifiers;
Protocol *protocol;
/* This no-op command is needed to keep the test compile on broken
gcc 3.x */
MyObject *object = [MyObject bycopyMethod];
/* Get the protocol object */
protocol = @protocol (MyProtocol);
/* Ask to the protocol for the description of the method bycopyMethod */
method = [protocol descriptionForClassMethod: @selector (bycopyMethod)];
if (method == NULL)
{
printf ("Could not find method bycopyMethod in protocol!\n");
exit (1);
}
/* Get the method types for the method - which encode return type,
arguments etc. */
method_types = method->types;
/* Get the qualifiers for the return type */
qualifiers = objc_get_type_qualifiers (method_types);
/* If _F_BYCOPY is not there, the compiler is broken */
if (! (qualifiers & _F_BYCOPY))
{
printf ("Failed - selector does not contain _F_BYCOPY qualifier!\n");
exit (1);
}
/* Else, happy end */
return 0;
}