1/* Test for passing arguments to ObjC methods in the context of template 2 expansion. */ 3/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ 4 5/* { dg-do run } */ 6/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ 7#include "../objc-obj-c++-shared/TestsuiteObject.m" 8#include <stdlib.h> 9 10#define CHECK_IF(expr) if(!(expr)) abort() 11 12@interface ObjCClass : TestsuiteObject 13{ 14@public 15 int info; 16} 17-(id) init; 18-(id) initWithInformation: (int) whatInfo; 19-(id) initWithInformation: (int) whatInfo andInfo: (int) info2; 20@end 21 22void foo(int info) { 23 ObjCClass *mObj1 = [[ObjCClass alloc] init]; 24 ObjCClass *mObj2 = [[ObjCClass alloc] initWithInformation: info]; 25 ObjCClass *mObj3 = [[ObjCClass alloc] initWithInformation: info andInfo: 39]; 26 27 CHECK_IF(mObj1->info == 666); 28 CHECK_IF(mObj2->info == info); 29 CHECK_IF(mObj3->info == info + 39); 30} 31 32template <class WrappedObjCClass> 33class ObjCObjectWrapper 34{ 35 public: 36 ObjCObjectWrapper(int info); 37 WrappedObjCClass *mObj1, *mObj2, *mObj3; 38}; 39 40template <class WrappedObjCClass> 41ObjCObjectWrapper<WrappedObjCClass>::ObjCObjectWrapper(int info) 42{ 43 mObj1 = [[WrappedObjCClass alloc] init]; 44 mObj2 = [[WrappedObjCClass alloc] initWithInformation: info]; 45 mObj3 = [[WrappedObjCClass alloc] initWithInformation: info andInfo: 67]; 46} 47 48@implementation ObjCClass 49-(id) init { 50 return [self initWithInformation:666]; 51} 52-(id) initWithInformation: (int) whatInfo { 53 [super init]; 54 info = whatInfo; 55 return self; 56} 57-(id) initWithInformation: (int) whatInfo andInfo: (int) info2 { 58 [super init]; 59 info = whatInfo + info2; 60 return self; 61} 62@end 63 64ObjCObjectWrapper<ObjCClass> staticInstance(42); 65 66int main(void) { 67 ObjCObjectWrapper<ObjCClass> stackInstance(47); 68 69 foo(89); 70 71 CHECK_IF(staticInstance.mObj1->info == 666); 72 CHECK_IF(staticInstance.mObj2->info == 42); 73 CHECK_IF(staticInstance.mObj3->info == 42 + 67); 74 75 CHECK_IF(stackInstance.mObj1->info == 666); 76 CHECK_IF(stackInstance.mObj2->info == 47); 77 CHECK_IF(stackInstance.mObj3->info == 47 + 67); 78 79 return 0; 80} 81 82