diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2012-01-10 00:37:01 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-01-10 00:37:01 +0000 |
| commit | a08a74705bb04e61752c43d7a6c61f73fc88c9c2 (patch) | |
| tree | abd446183cc08be9807fe2e79fba2d5d6ef8dd58 /clang/test | |
| parent | 33289908f9b211be66a2304785dfb26ec51d3e86 (diff) | |
| download | bcm5719-llvm-a08a74705bb04e61752c43d7a6c61f73fc88c9c2.tar.gz bcm5719-llvm-a08a74705bb04e61752c43d7a6c61f73fc88c9c2.zip | |
objc++: patch for IRgen for atomic properties of
c++ objects with non-trivial assignment/copy functions.
Also, one additional sema check. // rdar://6137845
llvm-svn: 147817
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/CodeGenObjCXX/property-object-reference-2.mm | 56 | ||||
| -rw-r--r-- | clang/test/SemaObjCXX/property-reference.mm | 4 | ||||
| -rw-r--r-- | clang/test/SemaObjCXX/property-synthesis-error.mm | 4 |
3 files changed, 60 insertions, 4 deletions
diff --git a/clang/test/CodeGenObjCXX/property-object-reference-2.mm b/clang/test/CodeGenObjCXX/property-object-reference-2.mm new file mode 100644 index 00000000000..b150a3e3ea9 --- /dev/null +++ b/clang/test/CodeGenObjCXX/property-object-reference-2.mm @@ -0,0 +1,56 @@ +// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s +// rdar://6137845 + +extern int DEFAULT(); + +struct TCPPObject +{ + TCPPObject(); + ~TCPPObject(); + TCPPObject(const TCPPObject& inObj, int i = DEFAULT()); + TCPPObject& operator=(const TCPPObject& inObj); + int filler[64]; +}; + + +@interface MyDocument +{ +@private + TCPPObject _cppObject; + TCPPObject _cppObject1; +} +@property (assign, readwrite, atomic) const TCPPObject MyProperty; +@property (assign, readwrite, atomic) const TCPPObject MyProperty1; +@end + +@implementation MyDocument + @synthesize MyProperty = _cppObject; + @synthesize MyProperty1 = _cppObject1; +@end + +// CHECK: define internal void @__copy_helper_atomic_property_( +// CHECK: [[TWO:%.*]] = load %struct.TCPPObject** [[ADDR:%.*]], align 8 +// CHECK: [[THREE:%.*]] = load %struct.TCPPObject** [[ADDR1:%.*]], align 8 +// CHECK: [[CALL:%.*]] = call i32 @_Z7DEFAULTv() +// CHECK: call void @_ZN10TCPPObjectC1ERKS_i(%struct.TCPPObject* [[TWO]], %struct.TCPPObject* [[THREE]], i32 [[CALL]]) +// CHECK: ret void + +// CHECK: define internal void @"\01-[MyDocument MyProperty]"( +// CHECK: [[ONE:%.*]] = bitcast i8* [[ADDPTR:%.*]] to %struct.TCPPObject* +// CHECK: [[TWO:%.*]] = bitcast %struct.TCPPObject* [[ONE]] to i8* +// CHECK: [[THREE:%.*]] = bitcast %struct.TCPPObject* [[AGGRESULT:%.*]] to i8* +// CHECK: call void @objc_copyCppObjectAtomic(i8* [[THREE]], i8* [[TWO]], i8* bitcast (void (%struct.TCPPObject*, %struct.TCPPObject*)* @__copy_helper_atomic_property_ to i8*)) +// CHECK: ret void + +// CHECK: define internal void @__assign_helper_atomic_property_( +// CHECK: [[TWO:%.*]] = load %struct.TCPPObject** [[ADDR:%.*]], align 8 +// CHECK: [[THREE:%.*]] = load %struct.TCPPObject** [[ADDR1:%.*]], align 8 +// CHECK: [[CALL:%.*]] = call %struct.TCPPObject* @_ZN10TCPPObjectaSERKS_(%struct.TCPPObject* [[TWO]], %struct.TCPPObject* [[THREE]]) +// CHECK: ret void + +// CHECK: define internal void @"\01-[MyDocument setMyProperty:]"( +// CHECK: [[ONE:%.*]] = bitcast i8* [[ADDRPTR:%.*]] to %struct.TCPPObject* +// CHECK: [[TWO:%.*]] = bitcast %struct.TCPPObject* [[ONE]] to i8* +// CHECK: [[THREE:%.*]] = bitcast %struct.TCPPObject* [[MYPROPERTY:%.*]] to i8* +// CHECK: call void @objc_copyCppObjectAtomic(i8* [[TWO]], i8* [[THREE]], i8* bitcast (void (%struct.TCPPObject*, %struct.TCPPObject*)* @__assign_helper_atomic_property_ to i8*)) +// CHECK: ret void diff --git a/clang/test/SemaObjCXX/property-reference.mm b/clang/test/SemaObjCXX/property-reference.mm index 236dba61fc2..9cc51d53760 100644 --- a/clang/test/SemaObjCXX/property-reference.mm +++ b/clang/test/SemaObjCXX/property-reference.mm @@ -8,7 +8,7 @@ public: TCPPObject(); ~TCPPObject(); - TCPPObject& operator=(const TCPPObject& inObj)const ; + TCPPObject& operator=(const TCPPObject& inObj)const ; // expected-note {{'operator=' declared here}} void* Data(); @@ -29,7 +29,7 @@ typedef const TCPPObject& CREF_TCPPObject; @implementation TNSObject @synthesize cppObjectNonAtomic; -@synthesize cppObjectAtomic; // expected-warning{{atomic property of type 'CREF_TCPPObject' (aka 'const TCPPObject &') synthesizing setter using non-trivial assignment operator}} +@synthesize cppObjectAtomic; // expected-error{{atomic property of reference type 'CREF_TCPPObject' (aka 'const TCPPObject &') cannot have non-trivial assignment operator}} @dynamic cppObjectDynamic; - (const TCPPObject&) cppObjectNonAtomic diff --git a/clang/test/SemaObjCXX/property-synthesis-error.mm b/clang/test/SemaObjCXX/property-synthesis-error.mm index 5ba4b70a2b6..c50756622cc 100644 --- a/clang/test/SemaObjCXX/property-synthesis-error.mm +++ b/clang/test/SemaObjCXX/property-synthesis-error.mm @@ -38,7 +38,7 @@ public: TCPPObject(const TCPPObject& inObj); TCPPObject(); ~TCPPObject(); - TCPPObject& operator=(const TCPPObject& inObj); + TCPPObject& operator=(const TCPPObject& inObj); // expected-note {{'operator=' declared here}} private: void* fData; }; @@ -67,7 +67,7 @@ private: @implementation MyDocument -@synthesize cppObject = _cppObject; // expected-warning {{atomic property of type 'const TCPPObject &' synthesizing setter using non-trivial assignment operator}} +@synthesize cppObject = _cppObject; // expected-error {{atomic property of reference type 'const TCPPObject &' cannot have non-trivial assignment operator}} @synthesize ncppObject = _ncppObject; @synthesize tcppObject = _tcppObject; |

