| /* Test for passing arguments to ObjC methods in the context of template | 
 |    expansion.  */ | 
 | /* Contributed by Ziemowit Laski  <zlaski@apple.com>.  */ | 
 |  | 
 | /* { dg-do run } */ | 
 | /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ | 
 | #include "../objc-obj-c++-shared/TestsuiteObject.m" | 
 | #include <stdlib.h> | 
 |  | 
 | #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 WrappedObjCClass> | 
 | class ObjCObjectWrapper | 
 | { | 
 |     public: | 
 |         ObjCObjectWrapper(int info); | 
 |         WrappedObjCClass *mObj1, *mObj2, *mObj3; | 
 | }; | 
 |  | 
 | template <class WrappedObjCClass> | 
 | ObjCObjectWrapper<WrappedObjCClass>::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<ObjCClass> staticInstance(42);  | 
 |  | 
 | int main(void) { | 
 |   ObjCObjectWrapper<ObjCClass> 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; | 
 | } | 
 |  |