diff options
Diffstat (limited to 'test/CodeGenObjCXX')
-rw-r--r-- | test/CodeGenObjCXX/block-var-layout.mm | 157 | ||||
-rw-r--r-- | test/CodeGenObjCXX/blocks.mm | 30 | ||||
-rw-r--r-- | test/CodeGenObjCXX/encode.mm | 12 | ||||
-rw-r--r-- | test/CodeGenObjCXX/implicit-copy-constructor.mm | 2 | ||||
-rw-r--r-- | test/CodeGenObjCXX/property-derived-to-base-conv.mm | 10 | ||||
-rw-r--r-- | test/CodeGenObjCXX/property-dot-copy.mm | 68 | ||||
-rw-r--r-- | test/CodeGenObjCXX/property-dot-reference.mm | 62 | ||||
-rw-r--r-- | test/CodeGenObjCXX/property-object-conditional-exp.mm | 38 | ||||
-rw-r--r-- | test/CodeGenObjCXX/property-objects.mm | 19 | ||||
-rw-r--r-- | test/CodeGenObjCXX/refence-assign-write-barrier.mm | 20 | ||||
-rw-r--r-- | test/CodeGenObjCXX/rtti.mm | 14 | ||||
-rw-r--r-- | test/CodeGenObjCXX/write-barrier-global-assign.mm | 29 |
12 files changed, 451 insertions, 10 deletions
diff --git a/test/CodeGenObjCXX/block-var-layout.mm b/test/CodeGenObjCXX/block-var-layout.mm new file mode 100644 index 0000000..363e214 --- /dev/null +++ b/test/CodeGenObjCXX/block-var-layout.mm @@ -0,0 +1,157 @@ +// RUN: %clang_cc1 -x objective-c++ -fblocks -fobjc-gc -triple x86_64-apple-darwin -emit-llvm %s -o %t-64.ll +// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.ll %s + +// See commentary in test/CodeGenObjC/block-var-layout.m, from which +// this is largely cloned. + +struct S { + int i1; + id o1; + struct V { + int i2; + id o2; + } v1; + int i3; + id o3; +}; + +__weak id wid; +void x(id y) {} +void y(int a) {} + +extern id opaque_id(); + +void f() { + __block int byref_int = 0; + char ch = 'a'; + char ch1 = 'b'; + char ch2 = 'c'; + short sh = 2; + const id bar = (id) opaque_id(); + id baz = 0; + __strong void *strong_void_sta; + __block id byref_bab = (id)0; + __block void *bl_var1; + int i; double dob; + +// Test 1 +// byref int, short, char, char, char, id, id, strong void*, byref id +// 01 35 10 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\015\10\00" + void (^b)() = ^{ + byref_int = sh + ch+ch1+ch2 ; + x(bar); + x(baz); + x((id)strong_void_sta); + x(byref_bab); + }; + b(); + +// Test 2 +// byref int, short, char, char, char, id, id, strong void*, byref void*, byref id +// 01 36 10 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\016\10\00" + void (^c)() = ^{ + byref_int = sh + ch+ch1+ch2 ; + x(bar); + x(baz); + x((id)strong_void_sta); + x(wid); + bl_var1 = 0; + x(byref_bab); + }; + c(); + +// Test 3 +// byref int, short, char, char, char, id, id, byref void*, int, double, byref id +// 01 34 11 30 00 +// FIXME: we'd get a better format here if we sorted by scannability, not just alignment +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"\014\11 \00" +void (^d)() = ^{ + byref_int = sh + ch+ch1+ch2 ; + x(bar); + x(baz); + x(wid); + bl_var1 = 0; + y(i + dob); + x(byref_bab); + }; + d(); + +// Test4 +// struct S (int, id, int, id, int, id) +// 01 41 11 11 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"\01A\11\11\00" + struct S s2; + void (^e)() = ^{ + x(s2.o1); + }; + e(); +} + +// Test 5 (unions/structs and their nesting): +void Test5() { + struct S5 { + int i1; + id o1; + struct V { + int i2; + id o2; + } v1; + int i3; + union UI { + void * i1; + id o1; + int i3; + id o3; + }ui; + }; + + union U { + void * i1; + id o1; + int i3; + id o3; + }ui; + + struct S5 s2; + union U u2; + +// struct s2 (int, id, int, id, int, id?), union u2 (id?) +// 01 41 11 12 70 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [6 x i8] c"\01A\11\12p\00" + void (^c)() = ^{ + x(s2.ui.o1); + x(u2.o1); + }; + c(); + +} + +// rdar: //8417746 +void CFRelease(id); +void notifyBlock(id dependentBlock) { + id singleObservationToken; + id token; + void (^b)(); + +// id, id, void(^)() +// 01 33 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"\013\00" + void (^wrapperBlock)() = ^() { + CFRelease(singleObservationToken); + CFRelease(singleObservationToken); + CFRelease(token); + CFRelease(singleObservationToken); + b(); + }; + wrapperBlock(); +} + +void test_empty_block() { +// 01 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [2 x i8] c"\01\00" + void (^wrapperBlock)() = ^() { + }; + wrapperBlock(); +} diff --git a/test/CodeGenObjCXX/blocks.mm b/test/CodeGenObjCXX/blocks.mm new file mode 100644 index 0000000..ffb916b --- /dev/null +++ b/test/CodeGenObjCXX/blocks.mm @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -x objective-c++ -fblocks -triple x86_64-apple-darwin %s +// rdar://8979379 + +@interface A +@end + +@interface B : A +@end + +void f(int (^bl)(B* b)); + +// Test1 +void g() { + f(^(A* a) { return 0; }); +} + +// Test2 +void g1() { + int (^bl)(B* b) = ^(A* a) { return 0; }; +} + +// Test3 +@protocol NSObject; + +void bar(id(^)(void)); + +void foo(id <NSObject>(^objectCreationBlock)(void)) { + return bar(objectCreationBlock); +} + diff --git a/test/CodeGenObjCXX/encode.mm b/test/CodeGenObjCXX/encode.mm index 83fb31e..5a49feb 100644 --- a/test/CodeGenObjCXX/encode.mm +++ b/test/CodeGenObjCXX/encode.mm @@ -50,3 +50,15 @@ class Int3 { int x, y, z; }; - (void) foo: (int (Int3::*)) member { } @end + +// rdar: // 8519948 +typedef float HGVec4f __attribute__ ((vector_size(16))); + +@interface RedBalloonHGXFormWrapper { + HGVec4f m_Transform[4]; +} +@end + +@implementation RedBalloonHGXFormWrapper +@end + diff --git a/test/CodeGenObjCXX/implicit-copy-constructor.mm b/test/CodeGenObjCXX/implicit-copy-constructor.mm index 489fd97..10eb644 100644 --- a/test/CodeGenObjCXX/implicit-copy-constructor.mm +++ b/test/CodeGenObjCXX/implicit-copy-constructor.mm @@ -41,7 +41,7 @@ void f(D d) { D d2(d); } -// CHECK: define linkonce_odr void @_ZN1DC1ERS_ +// CHECK: define linkonce_odr void @_ZN1DC1ERS_(%struct.D* %this, %struct.D*) unnamed_addr // CHECK: call void @_ZN1AC1Ev // CHECK: call void @_ZN1CC2ERS_1A // CHECK: call void @_ZN1AD1Ev diff --git a/test/CodeGenObjCXX/property-derived-to-base-conv.mm b/test/CodeGenObjCXX/property-derived-to-base-conv.mm index ada1202..d7c743c 100644 --- a/test/CodeGenObjCXX/property-derived-to-base-conv.mm +++ b/test/CodeGenObjCXX/property-derived-to-base-conv.mm @@ -1,7 +1,11 @@ // RUN: %clang_cc1 -fobjc-gc -triple x86_64-apple-darwin10 -emit-llvm -o - %s // rdar: // 7501812 -struct A { int member; }; +struct A { + int member; + void foo(); + A *operator->(); +}; struct B : A { }; @interface BInt { @@ -14,6 +18,8 @@ struct B : A { }; @end void g(BInt *bint) { - bint.value.member = 17; + bint.value.foo(); + bint.value->member = 17; + int x = bint.value.member; } diff --git a/test/CodeGenObjCXX/property-dot-copy.mm b/test/CodeGenObjCXX/property-dot-copy.mm new file mode 100644 index 0000000..9b23c58 --- /dev/null +++ b/test/CodeGenObjCXX/property-dot-copy.mm @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-nonfragile-abi -o - %s | FileCheck %s +// rdar://8427922 + +struct Vector3D +{ + float x, y, z; + Vector3D(); + Vector3D(const Vector3D &inVector); + Vector3D(float initX, float initY, float initZ); + Vector3D &operator=(const Vector3D & rhs); +}; + +@interface Object3D +{ + Vector3D position; + Vector3D length; +} +@property (assign) Vector3D position; +- (Vector3D) length; +- (void) setLength: (Vector3D)arg; +@end + +int main () +{ + Object3D *myObject; + Vector3D V3D(1.0f, 1.0f, 1.0f); +// CHECK: call void @_ZN8Vector3DC1ERKS_ + myObject.position = V3D; + +// CHECK: call void @_ZN8Vector3DC1ERKS_ + myObject.length = V3D; + + return 0; +} + +// rdar: // 8437253 +extern "C" void exit(...); + +struct CGPoint { + float x; + float y; +}; +typedef struct CGPoint CGPoint; + +extern "C" const CGPoint CGPointZero; + +bool operator==(const CGPoint& a, const CGPoint& b); + +@interface TIconViewSettings +@property (assign, nonatomic) CGPoint gridOffset; +@end + +@implementation TIconViewSettings +- (CGPoint) gridOffset +{ + return CGPointZero; +} + +- (void) foo +{ + if ((self.gridOffset) == CGPointZero) + exit(1); + + if (self.gridOffset == CGPointZero) + exit(1); +} +@end + diff --git a/test/CodeGenObjCXX/property-dot-reference.mm b/test/CodeGenObjCXX/property-dot-reference.mm new file mode 100644 index 0000000..6b53639 --- /dev/null +++ b/test/CodeGenObjCXX/property-dot-reference.mm @@ -0,0 +1,62 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-nonfragile-abi -fexceptions -o - %s | FileCheck %s +// rdar://8409336 + +struct TFENode { +void GetURL() const; +}; + +@interface TNodeIconAndNameCell +- (const TFENode&) node; +@end + +@implementation TNodeIconAndNameCell +- (const TFENode&) node { +// CHECK: call %struct.TFENode* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend +// CHECK-NEXT: call void @_ZNK7TFENode6GetURLEv(%struct.TFENode* %{{.*}}) + self.node.GetURL(); +} // expected-warning {{control reaches end of non-void function}} +@end + +// rdar://8437240 +struct X { + int x; +}; + +void f0(const X &parent); +@interface A +- (const X&) target; +@end +void f1(A *a) { +// CHECK: [[PRP:%.*]] = call %struct.X* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend +// CHECK-NEXT:call void @_Z2f0RK1X(%struct.X* [[PRP]]) + f0(a.target); + +// CHECK: [[MSG:%.*]] = call %struct.X* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend +// CHECK-NEXT:call void @_Z2f0RK1X(%struct.X* [[MSG]]) + f0([a target]); +} + +@interface Test2 +@property (readonly) int myProperty; +- (int) myProperty; +- (double) myGetter; +@end +void test2() { + Test2 *obj; + (void) obj.myProperty; + (void) obj.myGetter; + static_cast<void>(obj.myProperty); + static_cast<void>(obj.myGetter); + void(obj.myProperty); + void(obj.myGetter); +} +// CHECK: define void @_Z5test2v() +// CHECK: call i32 bitcast +// CHECK: call double bitcast +// CHECK: call i32 bitcast +// CHECK: call double bitcast +// CHECK: call i32 bitcast +// CHECK: call double bitcast + +// PR8751 +int test3(Test2 *obj) { return obj.myProperty; } diff --git a/test/CodeGenObjCXX/property-object-conditional-exp.mm b/test/CodeGenObjCXX/property-object-conditional-exp.mm new file mode 100644 index 0000000..826c351 --- /dev/null +++ b/test/CodeGenObjCXX/property-object-conditional-exp.mm @@ -0,0 +1,38 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s + +struct CGRect { + char* origin; + unsigned size; +}; +typedef struct CGRect CGRect; + +extern "C" bool CGRectIsEmpty(CGRect); + +@interface Foo { + CGRect out; +} +@property CGRect bounds; +- (CGRect) out; +@end + + +@implementation Foo + +- (void)bar { + CGRect dataRect; + CGRect virtualBounds; + +// CHECK: [[SRC:%.*]] = call %struct.CGRect bitcast (i8* (i8*, i8*, ...)* @objc_msgSend +// CHECK-NEXT:store %struct.CGRect [[SRC]], %struct.CGRect* + dataRect = CGRectIsEmpty(virtualBounds) ? self.bounds : virtualBounds; + dataRect = CGRectIsEmpty(virtualBounds) ? [self bounds] : virtualBounds; + dataRect = CGRectIsEmpty(virtualBounds) ? virtualBounds : self.bounds; + + dataRect = CGRectIsEmpty(virtualBounds) ? self.out : virtualBounds; + dataRect = CGRectIsEmpty(virtualBounds) ? [self out] : virtualBounds; + dataRect = CGRectIsEmpty(virtualBounds) ? virtualBounds : self.out; +} + +@dynamic bounds; +- (CGRect) out { return out; } +@end diff --git a/test/CodeGenObjCXX/property-objects.mm b/test/CodeGenObjCXX/property-objects.mm index 724cf68..8e98b0d 100644 --- a/test/CodeGenObjCXX/property-objects.mm +++ b/test/CodeGenObjCXX/property-objects.mm @@ -57,3 +57,22 @@ int main() { return 0; } +// rdar://8379892 +// CHECK: define void @_Z1fP1A +// CHECK: @objc_msgSend to void +struct X { + X(); + X(const X&); + ~X(); +}; + +@interface A { + X xval; +} +- (X)x; +- (void)setX:(X)x; +@end + +void f(A* a) { + a.x = X(); +} diff --git a/test/CodeGenObjCXX/refence-assign-write-barrier.mm b/test/CodeGenObjCXX/refence-assign-write-barrier.mm new file mode 100644 index 0000000..b295eb25 --- /dev/null +++ b/test/CodeGenObjCXX/refence-assign-write-barrier.mm @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -fobjc-gc -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// rdar://8681766 + +@interface NSArray +- (NSArray*) retain; +- (void) release; +@end + +void NSAssignArray(NSArray*& target, NSArray* newValue) +{ + if (target == newValue) + return; + + NSArray* oldValue = target; + + target = [newValue retain]; + + [oldValue release]; +} +// CHECK: {{call.* @objc_assign_strongCast}} diff --git a/test/CodeGenObjCXX/rtti.mm b/test/CodeGenObjCXX/rtti.mm index 27d24cb..72de3ac 100644 --- a/test/CodeGenObjCXX/rtti.mm +++ b/test/CodeGenObjCXX/rtti.mm @@ -4,19 +4,19 @@ namespace std { class type_info; } -// CHECK: @_ZTI1A = weak_odr constant {{.*}}@_ZTVN10__cxxabiv117__class_type_infoE{{.*}}@_ZTS1A +// CHECK: @_ZTI1A = linkonce_odr unnamed_addr constant {{.*}}@_ZTVN10__cxxabiv117__class_type_infoE{{.*}}@_ZTS1A @interface A @end -// CHECK: @_ZTI1B = weak_odr constant {{.*}}@_ZTVN10__cxxabiv120__si_class_type_infoE{{.*}}@_ZTS1B{{.*}}@_ZTI1A +// CHECK: @_ZTI1B = linkonce_odr unnamed_addr constant {{.*}}@_ZTVN10__cxxabiv120__si_class_type_infoE{{.*}}@_ZTS1B{{.*}}@_ZTI1A @interface B : A @end -// CHECK: @_ZTIP1B = weak_odr constant {{.*}}@_ZTVN10__cxxabiv119__pointer_type_infoE{{.*}}@_ZTSP1B{{.*}}), i32 0, {{.*}}@_ZTI1B -// CHECK: @_ZTI11objc_object = weak_odr constant {{.*}}@_ZTVN10__cxxabiv117__class_type_infoE{{.*}}@_ZTS11objc_object -// CHECK: @_ZTIP11objc_object = weak_odr constant {{.*}}@_ZTVN10__cxxabiv119__pointer_type_infoE{{.*}}@_ZTSP11objc_object{{.*}}@_ZTI11objc_object -// CHECK: @_ZTI10objc_class = weak_odr constant {{.*}}@_ZTVN10__cxxabiv117__class_type_infoE{{.*}}@_ZTS10objc_class -// CHECK: @_ZTIP10objc_class = weak_odr constant {{.*}}@_ZTVN10__cxxabiv119__pointer_type_infoE{{.*}}@_ZTSP10objc_class{{.*}}@_ZTI10objc_class +// CHECK: @_ZTIP1B = linkonce_odr unnamed_addr constant {{.*}}@_ZTVN10__cxxabiv119__pointer_type_infoE{{.*}}@_ZTSP1B{{.*}}), i32 0, {{.*}}@_ZTI1B +// CHECK: @_ZTI11objc_object = linkonce_odr unnamed_addr constant {{.*}}@_ZTVN10__cxxabiv117__class_type_infoE{{.*}}@_ZTS11objc_object +// CHECK: @_ZTIP11objc_object = linkonce_odr unnamed_addr constant {{.*}}@_ZTVN10__cxxabiv119__pointer_type_infoE{{.*}}@_ZTSP11objc_object{{.*}}@_ZTI11objc_object +// CHECK: @_ZTI10objc_class = linkonce_odr unnamed_addr constant {{.*}}@_ZTVN10__cxxabiv117__class_type_infoE{{.*}}@_ZTS10objc_class +// CHECK: @_ZTIP10objc_class = linkonce_odr unnamed_addr constant {{.*}}@_ZTVN10__cxxabiv119__pointer_type_infoE{{.*}}@_ZTSP10objc_class{{.*}}@_ZTI10objc_class @protocol P; diff --git a/test/CodeGenObjCXX/write-barrier-global-assign.mm b/test/CodeGenObjCXX/write-barrier-global-assign.mm new file mode 100644 index 0000000..a14804f --- /dev/null +++ b/test/CodeGenObjCXX/write-barrier-global-assign.mm @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -fobjc-gc -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// rdar://8761767 + +@class CPDestUser; + +CPDestUser* FUNC(); + +// CHECK: {{call.* @objc_assign_global}} +CPDestUser* globalUser = FUNC(); + +// CHECK: {{call.* @objc_assign_weak}} +__weak CPDestUser* weakUser = FUNC(); + + +// CHECK: {{call.* @objc_assign_global}} +static CPDestUser* staticUser = FUNC(); + +CPDestUser* GetDestUser() +{ +// CHECK: {{call.* @objc_assign_global}} + static CPDestUser* gUser = FUNC(); +// CHECK: {{call.* @objc_assign_weak}} + static __weak CPDestUser* wUser = FUNC(); + if (wUser) + return wUser; + if (staticUser) + return staticUser; + return gUser; +} |