1 // TEST_CONFIG CC=clang
4 #include <objc/runtime.h>
5 #include <objc/objc-internal.h>
6 #import <Foundation/NSObject.h>
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; }
15 int operator==(const SerialNumber &number) { return _number == number._number; }
16 int operator!=(const SerialNumber &number) { return _number != number._number; }
19 @interface TestAtomicProperty : NSObject {
22 @property(atomic) SerialNumber number;
25 @implementation TestAtomicProperty
27 #if 1 // with new enough compiler, this will be synthesized automatically.
29 extern void objc_copyCppObjectAtomic(void *dest, const void *src, void (*copyHelper) (void *dest, const void *source));
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);
37 - (SerialNumber)number {
39 objc_copyCppObjectAtomic(&result, &number, copySerialNumber);
43 - (void)setNumber:(SerialNumber)aNumber {
44 objc_copyCppObjectAtomic(&number, &aNumber, copySerialNumber);
48 testwarn("rdar://6137845 compiler should synthesize calls to objc_copyCppObjectAtomic");
61 TestAtomicProperty *test = [TestAtomicProperty new];
63 testassert(test.number != number);