aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGenObjC/ivar-invariant.m
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGenObjC/ivar-invariant.m')
-rw-r--r--test/CodeGenObjC/ivar-invariant.m68
1 files changed, 68 insertions, 0 deletions
diff --git a/test/CodeGenObjC/ivar-invariant.m b/test/CodeGenObjC/ivar-invariant.m
new file mode 100644
index 000000000000..7cafee70073f
--- /dev/null
+++ b/test/CodeGenObjC/ivar-invariant.m
@@ -0,0 +1,68 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -emit-llvm -o - %s | FileCheck %s
+
+@interface NSObject
++ (id) new;
+- (id) init;
+@end
+
+@interface Base : NSObject @end
+
+// @implementation Base
+// {
+// int dummy;
+// }
+// @end
+
+@interface Derived : Base
+{
+ @public int member;
+}
+@end
+
+@implementation Derived
+- (id) init
+{
+ self = [super init];
+ member = 42;
+ return self;
+}
+@end
+
+// CHECK: define internal i8* @"\01-[Derived init]"
+// CHECK: [[IVAR:%.*]] = load i64* @"OBJC_IVAR_$_Derived.member", !invariant.load
+
+void * variant_load_1(int i) {
+ void *ptr;
+ while (i--) {
+ Derived *d = [Derived new];
+ ptr = &d->member;
+ }
+ return ptr;
+}
+
+// CHECK: define i8* @variant_load_1(i32 %i)
+// CHECK: [[IVAR:%.*]] = load i64* @"OBJC_IVAR_$_Derived.member"{{$}}
+
+@interface Container : Derived @end
+@implementation Container
+- (void *) invariant_load_1
+{
+ return &self->member;
+}
+@end
+
+// CHECK: define internal i8* @"\01-[Container invariant_load_1]"
+// CHECK: [[IVAR:%.*]] = load i64* @"OBJC_IVAR_$_Derived.member", !invariant.load
+
+@interface ForBlock
+{
+@public
+ id foo;
+}
+@end
+
+// CHECK: define internal i8* @block_block_invoke
+// CHECK: load i64* @"OBJC_IVAR_$_ForBlock.foo"
+id (^block)(ForBlock*) = ^(ForBlock* a) {
+ return a->foo;
+};