1/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
2/* { dg-do run } */
3/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
4
5/* Test nested 'dot syntax' (xxx.yyy.zzz or [xxx yyy].zzz).  */
6
7#include <stdlib.h>
8#include <objc/objc.h>
9#include <objc/runtime.h>
10
11@class MyRootClass;
12
13static MyRootClass *shared_root = nil;
14
15@interface MyRootClass
16{
17  Class isa;
18  int a;
19  int b;
20  MyRootClass *next;
21}
22@property int b;
23@property (assign) MyRootClass *next;
24+ (id) initialize;
25+ (MyRootClass *)sharedInstance;
26+ (id) alloc;
27- (id) init;
28- (MyRootClass *)same;
29- (int) count;
30- (void) setCount: (int)count;
31@end
32
33@implementation MyRootClass
34@synthesize b;
35@synthesize next;
36+ (id) initialize { return self; }
37+ (id) alloc { return class_createInstance (self, 0); }
38- (id) init { return self; }
39+ (MyRootClass *)sharedInstance
40{
41  if (!shared_root)
42    shared_root = [[self alloc] init];
43
44  return shared_root;
45}
46- (MyRootClass *)same
47{
48  return self;
49}
50- (int) count
51{
52  return a;
53}
54- (void) setCount: (int)count
55{
56  a = count;
57}
58@end
59
60int main (void)
61{
62  MyRootClass *object = [[MyRootClass alloc] init];
63
64  /* Test ClassName.accessor.accessor.  */
65  MyRootClass.sharedInstance.count = 500;
66  if (MyRootClass.sharedInstance.count != 500)
67    abort ();
68
69  /* Test object.accessor.accessor.  */
70  object.same.count = 1000;
71  if (object.same.count != 1000)
72    abort ();
73
74  /* Test object.accessor.property.  */
75  object.same.next = object;
76  if (object.same.next != object)
77    abort ();
78
79  /* Test lots of nesting.  */
80  if (object.next.next.same.same.next.next.same != object)
81    abort ();
82
83  /* Test more nesting.  */
84  MyRootClass.sharedInstance.next = object;
85  MyRootClass.sharedInstance.next.next.next.next.next.count = 2000;
86  if (MyRootClass.sharedInstance.next.next.next.next.next.count != 2000)
87    abort ();
88
89  /* Test more nesting.  */
90  MyRootClass.sharedInstance.same.same.same.same.same.count = 3000;
91  if (MyRootClass.sharedInstance.same.same.same.same.same.count != 3000)
92    abort ();
93
94  /* Test [object method].property.  */
95  [MyRootClass sharedInstance].count = 5000;
96  if ([MyRootClass sharedInstance].count != 5000)
97    abort ();
98
99  /* Just a final check.  */
100  if (shared_root.count != 5000)
101    abort ();
102
103  return 0;
104}
105
106
107