OSDN Git Service

PR testsuite/23611, PR testsuite/23615
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / obj-c++.dg / qual-types-1.mm
1 /* Test if ObjC++ can distinguish protocol qualifiers from
2    template arguments.  */
3 /* Author:  Ziemowit Laski <zlaski@apple.com>.  */
4
5 /* { dg-do run } */
6
7 #include <objc/Object.h>
8 #include <stdlib.h>
9
10 #define CHECK_IF(expr) if(!(expr)) abort()
11
12 @protocol Zone
13 + allocFromZone:(void *)zone;
14 - copyFromZone:(void *)zone; 
15 @end
16
17 @protocol Init <Zone>
18 + initialize;
19 - init; 
20 @end
21
22 @interface Foo: Object
23 { @public int val; }
24 - init;
25 @end
26
27 template <class T, class U> struct X {
28   T x; U y;
29 };
30
31 X<int, float> xx;
32
33 template <typename T> struct Holder
34 {
35   T *obj;
36   static int counter;
37   Holder(void) { obj = [[T alloc] init]; }
38   ~Holder(void) { [obj free]; --counter; }
39   id <Init, Zone> getObjId(void) { return obj; }
40   Object <Zone, Init> *getObj(void) { return obj; }
41 };
42
43 typedef Holder <Foo <Init, Zone> > FooHolder;
44
45 @implementation Foo
46 -(id) init {
47   [super init];
48   val = ++FooHolder::counter;
49   return self;
50 }
51 @end
52
53 template <typename T>
54 int Holder<T>::counter = 0;
55
56 int main (void) {
57   CHECK_IF(FooHolder::counter == 0);
58   {
59     FooHolder holder;
60     CHECK_IF(holder.obj->val == 1);
61     CHECK_IF(FooHolder::counter == 1);
62     FooHolder holder2;
63     CHECK_IF(holder2.obj->val == 2);
64     CHECK_IF(FooHolder::counter == 2);
65   }
66   CHECK_IF(FooHolder::counter == 0);
67   return 0;
68 }