1// RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -emit-llvm -o - %s | FileCheck %s
2
3@interface NSObject
4+ (id) new;
5- (id) init;
6@end
7
8@interface Base : NSObject @end
9
10// @implementation Base
11// {
12//     int dummy;
13// }
14// @end
15
16@interface Derived : Base
17{
18    @public int member;
19}
20@end
21
22@implementation Derived
23- (id) init
24{
25    self = [super init];
26    member = 42;
27    return self;
28}
29@end
30
31// CHECK: define internal i8* @"\01-[Derived init]"
32// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load
33
34void * variant_load_1(int i) {
35    void *ptr;
36    while (i--) {
37        Derived *d = [Derived new];
38        ptr = &d->member;
39    }
40    return ptr;
41}
42
43// CHECK-LABEL: define{{.*}} i8* @variant_load_1(i32 %i)
44// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8{{$}}
45
46@interface Container : Derived @end
47@implementation Container
48- (void *) invariant_load_1
49{
50    return &self->member;
51}
52@end
53
54// CHECK-LABEL: define internal i8* @"\01-[Container invariant_load_1]"
55// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load
56
57@interface ForBlock
58{
59@public
60  id foo;
61}
62@end
63
64// CHECK-LABEL: define internal i8* @block_block_invoke
65// CHECK: load i64, i64* @"OBJC_IVAR_$_ForBlock.foo"
66id (^block)(ForBlock*) = ^(ForBlock* a) {
67  return a->foo;
68};
69