]> git.saurik.com Git - apple/objc4.git/blob - test/atomicProperty.mm
objc4-532.2.tar.gz
[apple/objc4.git] / test / atomicProperty.mm
1 // TEST_CONFIG CC=clang
2
3 #include "test.h"
4 #include <objc/runtime.h>
5 #include <objc/objc-internal.h>
6 #import <Foundation/NSObject.h>
7
8 class SerialNumber {
9 size_t _number;
10 public:
11 SerialNumber() : _number(42) {}
12 SerialNumber(const SerialNumber &number) : _number(number._number + 1) {}
13 SerialNumber &operator=(const SerialNumber &number) { _number = number._number + 1; return *this; }
14
15 int operator==(const SerialNumber &number) { return _number == number._number; }
16 int operator!=(const SerialNumber &number) { return _number != number._number; }
17 };
18
19 @interface TestAtomicProperty : NSObject {
20 SerialNumber number;
21 }
22 @property(atomic) SerialNumber number;
23 @end
24
25 @implementation TestAtomicProperty
26
27 #if 1 // with new enough compiler, this will be synthesized automatically.
28
29 extern void objc_copyCppObjectAtomic(void *dest, const void *src, void (*copyHelper) (void *dest, const void *source));
30
31 static void copySerialNumber(void *d, const void *s) {
32 SerialNumber *dest = (SerialNumber *)d;
33 const SerialNumber *src = (const SerialNumber *)s;
34 dest->operator=(*src);
35 }
36
37 - (SerialNumber)number {
38 SerialNumber result;
39 objc_copyCppObjectAtomic(&result, &number, copySerialNumber);
40 return result;
41 }
42
43 - (void)setNumber:(SerialNumber)aNumber {
44 objc_copyCppObjectAtomic(&number, &aNumber, copySerialNumber);
45 }
46
47 +(void)initialize {
48 testwarn("rdar://6137845 compiler should synthesize calls to objc_copyCppObjectAtomic");
49 }
50
51 #else
52 @synthesize number;
53 #endif
54
55 @end
56
57 int main()
58 {
59 PUSH_POOL {
60 SerialNumber number;
61 TestAtomicProperty *test = [TestAtomicProperty new];
62 test.number = number;
63 testassert(test.number != number);
64 } POP_POOL;
65
66 succeed(__FILE__);
67 }