aboutsummaryrefslogtreecommitdiffstats
path: root/test/FrontendObjC
diff options
context:
space:
mode:
Diffstat (limited to 'test/FrontendObjC')
-rw-r--r--test/FrontendObjC/2009-04-28-bitfield-vs-vbc.m127
1 files changed, 127 insertions, 0 deletions
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 0000000..8306fcc
--- /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 <stdlib.h>
+
+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);
+}