// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fms-extensions -rewrite-objc %s -o %t-modern-rw.cpp
// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-modern-rw.cpp
// rdar://13138459

// -Did="void*" -DSEL="void *" -DClass="void*"
@interface NSMutableArray {
  id isa;
}
@end

typedef unsigned char BOOL;
typedef unsigned long NSUInteger;

__attribute__((visibility("hidden")))
@interface __NSArrayM : NSMutableArray {
    NSUInteger _used;
    NSUInteger _doHardRetain:1;
    NSUInteger _doWeakAccess:1;
#if __LP64__
    NSUInteger _size:62;
#else
    NSUInteger _size:30;
#endif
    NSUInteger _hasObjects:1;
    NSUInteger _hasStrongReferences:1;
#if __LP64__
    NSUInteger _offset:62;
#else
    NSUInteger _offset:30;
#endif
    unsigned long _mutations;
    id *_list;
}
@end


id __CFAllocateObject2();
BOOL objc_collectingEnabled();

@implementation __NSArrayM
+ (id)__new:(const id [])objects :(NSUInteger)count :(BOOL)hasObjects :(BOOL)hasStrong :(BOOL)transferRetain {
    __NSArrayM *newArray = (__NSArrayM *)__CFAllocateObject2();
    newArray->_size = count;
    newArray->_mutations = 1;
    newArray->_doHardRetain = (hasObjects && hasStrong);
    newArray->_doWeakAccess = (objc_collectingEnabled() && !hasStrong);
    newArray->_hasObjects = hasObjects;
    newArray->_hasStrongReferences = hasStrong;
    newArray->_list = 0;
    return *newArray->_list;
}
@end

// Test2
@interface Super {
  int ivar_super_a : 5;
}
@end

@interface A : Super {
@public
  int ivar_a : 5;
}
@end

int f0(A *a) {
  return a->ivar_a;
}

@interface A () {
@public
  int ivar_ext_a : 5;
  int ivar_ext_b : 5;
}@end

int f1(A *a) {
  return a->ivar_ext_a + a->ivar_a;
}

@interface A () {
@public
  int ivar_ext2_a : 5;
  int ivar_ext2_b : 5;
}@end

int f2(A* a) {
  return a->ivar_ext2_a + a->ivar_ext_a + a->ivar_a;
}

@implementation A {
@public
  int ivar_b : 5;
  int ivar_c : 5;
  int ivar_d : 5;
}
@end

int f3(A *a) {  
  return a->ivar_d + a->ivar_ext2_a + a->ivar_ext_a + a->ivar_a;
}

__attribute__((objc_root_class)) @interface Base
{
    struct objc_class *isa;
    int full;
    int full2: 32;
    int _refs: 8;
    int field2: 3;
    unsigned f3: 8;
    short cc;
    unsigned g: 16;
    int r2: 8;
    int r3: 8;
    int r4: 2;
    int r5: 8;
    char c;
}
@end

@implementation Base @end
