1// TEST_CONFIG
2
3#include "test.h"
4#include "testroot.i"
5#include <objc/runtime.h>
6
7
8@interface Sub1 : TestRoot {
9    // id isa;  // 0..4
10    BOOL b;     // 4..5
11}
12@end
13
14@implementation Sub1 @end
15
16@interface Sub2 : Sub1 {
17    // id isa   // 0..4    0..8
18    // BOOL b   // 4..5    8..9
19    BOOL b2;    // 5..6    9..10
20    id o;       // 8..12   16..24
21}
22@end
23@implementation Sub2 @end
24
25@interface Sub3 : Sub1 {
26    // id isa;  // 0..4    0..8
27    // BOOL b;  // 4..5    8..9
28    id o;       // 8..12   16..24
29    BOOL b2;    // 12..13  24..25
30}
31@end
32@implementation Sub3 @end
33
34int main()
35{
36    testassert(sizeof(id) == class_getInstanceSize([TestRoot class]));
37    testassert(2*sizeof(id) == class_getInstanceSize([Sub1 class]));
38    testassert(3*sizeof(id) == class_getInstanceSize([Sub2 class]));
39    testassert(4*sizeof(id) == class_getInstanceSize([Sub3 class]));
40
41#if !__has_feature(objc_arc)
42    id o;
43
44    o = [TestRoot new];
45    testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(object_getClass(o)));
46    RELEASE_VAR(o);
47    o = [Sub1 new];
48    testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(object_getClass(o)));
49    RELEASE_VAR(o);
50    o = [Sub2 new];
51    testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(object_getClass(o)));
52    RELEASE_VAR(o);
53    o = [Sub3 new];
54    testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(object_getClass(o)));
55    RELEASE_VAR(o);
56#endif
57
58    succeed(__FILE__);
59}
60