/* Test for passing arguments to ObjC methods in the context of template expansion. */ /* Contributed by Ziemowit Laski . */ /* { dg-do run } */ /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ #include "../objc-obj-c++-shared/TestsuiteObject.m" #include #define CHECK_IF(expr) if(!(expr)) abort() @interface ObjCClass : TestsuiteObject { @public int info; } -(id) init; -(id) initWithInformation: (int) whatInfo; -(id) initWithInformation: (int) whatInfo andInfo: (int) info2; @end void foo(int info) { ObjCClass *mObj1 = [[ObjCClass alloc] init]; ObjCClass *mObj2 = [[ObjCClass alloc] initWithInformation: info]; ObjCClass *mObj3 = [[ObjCClass alloc] initWithInformation: info andInfo: 39]; CHECK_IF(mObj1->info == 666); CHECK_IF(mObj2->info == info); CHECK_IF(mObj3->info == info + 39); } template class ObjCObjectWrapper { public: ObjCObjectWrapper(int info); WrappedObjCClass *mObj1, *mObj2, *mObj3; }; template ObjCObjectWrapper::ObjCObjectWrapper(int info) { mObj1 = [[WrappedObjCClass alloc] init]; mObj2 = [[WrappedObjCClass alloc] initWithInformation: info]; mObj3 = [[WrappedObjCClass alloc] initWithInformation: info andInfo: 67]; } @implementation ObjCClass -(id) init { return [self initWithInformation:666]; } -(id) initWithInformation: (int) whatInfo { [super init]; info = whatInfo; return self; } -(id) initWithInformation: (int) whatInfo andInfo: (int) info2 { [super init]; info = whatInfo + info2; return self; } @end ObjCObjectWrapper staticInstance(42); int main(void) { ObjCObjectWrapper stackInstance(47); foo(89); CHECK_IF(staticInstance.mObj1->info == 666); CHECK_IF(staticInstance.mObj2->info == 42); CHECK_IF(staticInstance.mObj3->info == 42 + 67); CHECK_IF(stackInstance.mObj1->info == 666); CHECK_IF(stackInstance.mObj2->info == 47); CHECK_IF(stackInstance.mObj3->info == 47 + 67); return 0; }