* lto.c (do_stream_out): Add PART parameter; open dump file.
[official-gcc.git] / gcc / testsuite / obj-c++.dg / qual-types-1.mm
blobdd0eb42bc4f00528b5931fd905c3f01ccd49217e
1 /* Test if ObjC++ can distinguish protocol qualifiers from
2    template arguments.  */
3 /* Author:  Ziemowit Laski <zlaski@apple.com>.  */
5 /* { dg-do run } */
6 /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
7 #include "../objc-obj-c++-shared/TestsuiteObject.m"
8 #include <stdlib.h>
10 #define CHECK_IF(expr) if(!(expr)) abort()
12 @protocol Zone
13 + allocFromZone:(void *)zone;
14 - copyFromZone:(void *)zone; 
15 @end
17 @protocol Init <Zone>
18 + initialize;
19 - init; 
20 @end
22 @interface Foo: TestsuiteObject
23 { @public int val; }
24 - init;
25 @end
27 template <class T, class U> struct X {
28   T x; U y;
31 X<int, float> xx;
33 template <typename T> struct Holder
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   TestsuiteObject <Zone, Init> *getObj(void) { return obj; }
43 typedef Holder <Foo <Init, Zone> > FooHolder;
45 @implementation Foo
46 -(id) init {
47   [super init];
48   val = ++FooHolder::counter;
49   return self;
51 @end
53 template <typename T>
54 int Holder<T>::counter = 0;
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;