/* 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;
}

