diff --git a/test/FrontendObjC/2009-04-28-bitfield-vs-vbc.m b/test/FrontendObjC/2009-04-28-bitfield-vs-vbc.m new file mode 100644 index 00000000000..8306fcc7e07 --- /dev/null +++ b/test/FrontendObjC/2009-04-28-bitfield-vs-vbc.m @@ -0,0 +1,127 @@ +// RUN: %llvmgcc -S -x objective-c -m32 %s -o %t +// This used to crash, 6831493. +#include + +struct s0 { + double x; +}; + +@interface I2 { + struct s0 _iv1; +} +@end + +@interface I3 : I2 { + unsigned int _iv2 :1; + unsigned : 0; + unsigned int _iv3 : 3; +} +@end + +@interface I4 : I3 { + char _iv4; +} +@end + +@interface I5 : I4 { + char _iv5; + int _iv6; + int _iv7; +} + +@property int P1; +@end + +@implementation I2 +@end + +@implementation I3 +@end + +@implementation I4 +@end + +@interface I5 () +@property int P2; +@end + +#if 0 +int g2 = sizeof(I2); +int g3 = sizeof(I3); +int g4 = sizeof(I4); +int g5_0 = sizeof(I5); +#endif + +@implementation I5 +#ifdef __x86_64 +@synthesize P1 = _MadeUpName; +@synthesize P2 = _AnotherMadeUpName; +#else +@synthesize P1 = _iv6; +@synthesize P2 = _iv7; +#endif +@end + +#if 0 +int g5_1 = sizeof(I5); +#endif + +@interface T0_I0 { + double iv_A_0; + char iv_A_1; +} +@end + +@interface T0_I1 : T0_I0 { + char iv_B_0; +} +@end + +@interface T0_I2 : T0_I1 { + char iv_C_0; +} +@end + +#if 0 +int g6 = sizeof(T0_I0); +int g7 = sizeof(T0_I1); +int g8 = sizeof(T0_I2); +#endif + +@implementation T0_I0 @end +@implementation T0_I1 @end +@implementation T0_I2 @end + +void f0(I2*i2,I3*i3,I4*i4,I5*i5,T0_I0*t0_i0,T0_I1*t0_i1,T0_I2*t0_i2) { +} + +// Thomas Wang's ui32 hash. +unsigned hash_ui32_to_ui32(unsigned a) { + a = (a ^ 61) ^ (a >> 16); + a = a + (a << 3); + a = a ^ (a >> 4); + a = a * 0x27d4eb2d; + a = a ^ (a >> 15); + return a; +} + +unsigned char hash_ui32_to_ui8(unsigned ui) { + ui = hash_ui32_to_ui32(ui); + ui ^= ui>>8; + ui ^= ui>>8; + ui ^= ui>>8; + return (unsigned char) ui; +} + +void *init() { + unsigned i, N = 1024; + unsigned char *p = malloc(N); + for (i=0; i != N; ++i) + p[i] = hash_ui32_to_ui8(i); + return p; +} + +int main(){ + void *p = init(); + f0(p,p,p,p,p,p,p); +}