diff options
Diffstat (limited to 'test/CodeGenObjC/ivar-invariant.m')
-rw-r--r-- | test/CodeGenObjC/ivar-invariant.m | 68 |
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; +}; |