/* APPLE LOCAL file mainline */
/* Test if ObjC++ can distinguish protocol qualifiers from
   template arguments.  */
/* Author:  Ziemowit Laski <zlaski@apple.com>.  */
/* { dg-do run } */

/* APPLE LOCAL radar 4894756 */
#include "../objc/execute/Object2.h"
#include <stdlib.h>

#define CHECK_IF(expr) if(!(expr)) abort()

@protocol Zone
+ allocFromZone:(void *)zone;
- copyFromZone:(void *)zone; 
@end

@protocol Init <Zone>
+ initialize;
- init; 
@end

@interface Foo: Object
{ @public int val; }
- init;
@end

template <class T, class U> struct X {
  T x; U y;
};

X<int, float> xx;

template <typename T> struct Holder
{
  T *obj;
  static int counter;
  Holder(void) { obj = [[T alloc] init]; }
  ~Holder(void) { [obj free]; --counter; }
  id <Init, Zone> getObjId(void) { return obj; }
  Object <Zone, Init> *getObj(void) { return obj; }
};

typedef Holder <Foo <Init, Zone> > FooHolder;

@implementation Foo
-(id) init {
  [super init];
  val = ++FooHolder::counter;
  return self;
}
@end

template <typename T>
int Holder<T>::counter = 0;

int main (void) {
    CHECK_IF(FooHolder::counter == 0);
    {
      FooHolder holder;
      CHECK_IF(holder.obj->val == 1);
      CHECK_IF(FooHolder::counter == 1);
      FooHolder holder2;
      CHECK_IF(holder2.obj->val == 2);
      CHECK_IF(FooHolder::counter == 2);
    }
    CHECK_IF(FooHolder::counter == 0);
    return 0;
}




