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 dot-syntax with tricky assignments.  */
6
7#include <stdlib.h>
8#include <objc/objc.h>
9#include <objc/runtime.h>
10
11@interface MyRootClass
12{
13  Class isa;
14  int a;
15}
16+ (id) initialize;
17+ (id) alloc;
18- (id) init;
19- (int) count;
20- (void) setCount: (int)count;
21- (int) somethingToExecuteOnlyOnce;
22@end
23
24@implementation MyRootClass
25+ (id) initialize { return self; }
26+ (id) alloc { return class_createInstance (self, 0); }
27- (id) init { return self; }
28- (int) count
29{
30  return a;
31}
32- (void) setCount: (int)count
33{
34  a = count;
35}
36- (int) somethingToExecuteOnlyOnce
37{
38  a++;
39  return 10;
40}
41@end
42
43int main (void)
44{
45  MyRootClass *object1 = [[MyRootClass alloc] init];
46  MyRootClass *object2 = [[MyRootClass alloc] init];
47  MyRootClass *object3 = [[MyRootClass alloc] init];
48  int i;
49
50  object1.count = 10;
51  if (object1.count != 10)
52    abort ();
53
54  object2.count = 10;
55  if (object2.count != 10)
56    abort ();
57
58  /* Test multiple assignments to a constant.  */
59  object1.count = object2.count = 20;
60
61  if (object1.count != 20 || object2.count != 20)
62    abort ();
63
64  i = object1.count = 30;
65
66  if (i != 30 || object1.count != 30)
67    abort ();
68
69  i = object2.count = 30;
70
71  if (i != 30 || object2.count != 30)
72    abort ();
73
74  /* Test a simple assignment to something with a side-effect; the
75     'rhs' should be evaluated only once.  */
76  object1.count = ([object2 somethingToExecuteOnlyOnce] > 0 ? 30 : 45);
77
78  if (object1.count != 30 || object2.count != 31)
79    abort ();
80
81  /* Test multiple assignments with side effects.  */
82  object3.count = object1.count = ([object2 somethingToExecuteOnlyOnce] > 0 ? 30 : 45);
83
84  if (object1.count != 30 || object2.count != 32 || object3.count != 30)
85    abort ();
86
87  return 0;
88}
89
90
91