1/* Test for using ObjC classes as C++ template parameters.  */
2/* Author:  Ziemowit Laski <zlaski@apple.com>.  */
3
4/* { dg-do run } */
5/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
6#include "../objc-obj-c++-shared/TestsuiteObject.m"
7#include <stdlib.h>
8
9#define CHECK_IF(expr) if(!(expr)) abort()
10
11@interface Base: TestsuiteObject
12- (int) meth;
13@end
14
15@interface Derived: Base
16- (int) meth;
17@end
18
19static int count = 0;
20
21template <class T> struct Templ
22{
23  T *m;
24  int i;
25  Templ(): i(55), m([[T alloc] init]) { count++; }
26  ~Templ() { [m free]; count--; }
27};
28
29@implementation Base
30- (int) meth { return 333; }
31@end
32
33@implementation Derived
34- (int) meth { return 666; }
35@end
36
37int main (void) {
38  CHECK_IF(count == 0);
39  {
40    Templ<Derived> derived;
41    CHECK_IF(derived.i == 55 && count == 1);
42    Templ<Base> base;
43    CHECK_IF(base.i == 55 && count == 2);
44    CHECK_IF([base.m meth] == 333);
45    CHECK_IF([derived.m meth] == 666);
46  }
47  CHECK_IF(count == 0);
48  return 0;
49}
50
51