1// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fms-extensions -rewrite-objc %s -o %t-modern-rw.cpp
2// RUN: %clang_cc1 -fsyntax-only -std=gnu++98 -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-modern-rw.cpp
3// rdar://13138459
4
5// -Did="void*" -DSEL="void *" -DClass="void*"
6@interface NSMutableArray {
7  id isa;
8}
9@end
10
11typedef unsigned char BOOL;
12typedef unsigned long NSUInteger;
13
14__attribute__((visibility("hidden")))
15@interface __NSArrayM : NSMutableArray {
16    NSUInteger _used;
17    NSUInteger _doHardRetain:1;
18    NSUInteger _doWeakAccess:1;
19#if __LP64__
20    NSUInteger _size:62;
21#else
22    NSUInteger _size:30;
23#endif
24    NSUInteger _hasObjects:1;
25    NSUInteger _hasStrongReferences:1;
26#if __LP64__
27    NSUInteger _offset:62;
28#else
29    NSUInteger _offset:30;
30#endif
31    unsigned long _mutations;
32    id *_list;
33}
34@end
35
36
37id __CFAllocateObject2();
38BOOL objc_collectingEnabled();
39
40@implementation __NSArrayM
41+ (id)__new:(const id [])objects :(NSUInteger)count :(BOOL)hasObjects :(BOOL)hasStrong :(BOOL)transferRetain {
42    __NSArrayM *newArray = (__NSArrayM *)__CFAllocateObject2();
43    newArray->_size = count;
44    newArray->_mutations = 1;
45    newArray->_doHardRetain = (hasObjects && hasStrong);
46    newArray->_doWeakAccess = (objc_collectingEnabled() && !hasStrong);
47    newArray->_hasObjects = hasObjects;
48    newArray->_hasStrongReferences = hasStrong;
49    newArray->_list = 0;
50    return *newArray->_list;
51}
52@end
53
54// Test2
55@interface Super {
56  int ivar_super_a : 5;
57}
58@end
59
60@interface A : Super {
61@public
62  int ivar_a : 5;
63}
64@end
65
66int f0(A *a) {
67  return a->ivar_a;
68}
69
70@interface A () {
71@public
72  int ivar_ext_a : 5;
73  int ivar_ext_b : 5;
74}@end
75
76int f1(A *a) {
77  return a->ivar_ext_a + a->ivar_a;
78}
79
80@interface A () {
81@public
82  int ivar_ext2_a : 5;
83  int ivar_ext2_b : 5;
84}@end
85
86int f2(A* a) {
87  return a->ivar_ext2_a + a->ivar_ext_a + a->ivar_a;
88}
89
90@implementation A {
91@public
92  int ivar_b : 5;
93  int ivar_c : 5;
94  int ivar_d : 5;
95}
96@end
97
98int f3(A *a) {
99  return a->ivar_d + a->ivar_ext2_a + a->ivar_ext_a + a->ivar_a;
100}
101
102__attribute__((objc_root_class)) @interface Base
103{
104    struct objc_class *isa;
105    int full;
106    int full2: 32;
107    int _refs: 8;
108    int field2: 3;
109    unsigned f3: 8;
110    short cc;
111    unsigned g: 16;
112    int r2: 8;
113    int r3: 8;
114    int r4: 2;
115    int r5: 8;
116    char c;
117}
118@end
119
120@implementation Base @end
121