1/* 2 * Contributed by Nicola Pero <nicola@brainstorm.co.uk> 3 * Wed Feb 28 12:27:03 CET 2001 4 */ 5 6/* 7 * This test contains some no-op code which is needed to keep it 8 * compile on broken gcc 3.x. Anyway, the no-op code does not 9 * interfere with what we are testing, which is that the `bycopy' 10 * keyword generates the _F_BYCOPY qualifier for the return type. */ 11 12extern int printf (const char *, ...); 13 14#include <objc/objc.h> 15#include "../../objc-obj-c++-shared/runtime.h" 16#include "../../objc-obj-c++-shared/TestsuiteObject.m" 17 18@protocol MyProtocol 19+ (bycopy id<MyProtocol>) bycopyMethod; 20@end 21 22/* This no-op class to keep it compile under broken gcc 3.x */ 23@interface MyObject : TestsuiteObject <MyProtocol> 24@end 25 26@implementation MyObject 27+ (bycopy id<MyProtocol>) bycopyMethod 28{ 29 return [MyObject alloc]; 30} 31@end 32 33/* The following header, together with the implementation included below, 34 emulate functionality provided by the GNU runtime but not available from 35 the NeXT runtime. */ 36#include "../../objc-obj-c++-shared/objc-test-suite-next-encode-assist.h" 37 38int main (void) 39{ 40 struct objc_method_description method; 41 const char *method_types; 42 unsigned qualifiers; 43 Protocol *protocol; 44 /* This no-op command is needed to keep the test compile on broken 45 gcc 3.x */ 46 MyObject *object = [MyObject bycopyMethod]; 47 48 /* Get the protocol object */ 49 protocol = @protocol (MyProtocol); 50 51 /* Ask to the protocol for the description of the method bycopyMethod */ 52 method = protocol_getMethodDescription (protocol, @selector (bycopyMethod), 53 YES, NO); 54 55 /* Get the method types for the method - which encode return type, 56 arguments etc. */ 57 method_types = method.types; 58 59 if (method_types == NULL) 60 { 61 printf ("Could not find method bycopyMethod in protocol!\n"); 62 return 1; 63 } 64 65 /* Get the qualifiers for the return type */ 66 qualifiers = objc_get_type_qualifiers (method_types); 67 68 /* If _F_BYCOPY is not there, the compiler is broken */ 69 if (! (qualifiers & _F_BYCOPY)) 70 { 71 printf ("Failed - selector does not contain _F_BYCOPY qualifier!\n"); 72 return 1; 73 } 74 75 /* Else, happy end */ 76 return 0; 77} 78 79#ifdef __NEXT_RUNTIME__ 80unsigned 81objc_get_type_qualifiers (const char *type) 82{ 83 unsigned res = 0; 84 BOOL flag = YES; 85 86 while (flag) 87 switch (*type++) 88 { 89 case _C_CONST: res |= _F_CONST; break; 90 case _C_IN: res |= _F_IN; break; 91 case _C_INOUT: res |= _F_INOUT; break; 92 case _C_OUT: res |= _F_OUT; break; 93 case _C_BYCOPY: res |= _F_BYCOPY; break; 94 case _C_BYREF: res |= _F_BYREF; break; 95 case _C_ONEWAY: res |= _F_ONEWAY; break; 96 case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break; 97 default: flag = NO; 98 } 99 100 return res; 101} 102#endif 103