// RUN: %clang_cc1 -emit-llvm -o - -triple x86_64-apple-darwin9 %s | FileCheck %s // RUN: %clang_cc1 -emit-llvm -o - -triple thumbv7-apple-ios -target-abi apcs-gnu %s | FileCheck %s -check-prefix=CHECK-ARM // rdar://8823265 // Note that we're declaring global variables with these types, // triggering both Sema and IRGen struct layout. #define ATTR __attribute__((__ms_struct__)) struct { char foo; long : 0; char bar; } ATTR t1; int s1 = sizeof(t1); // CHECK: @s1 ={{.*}} global i32 2 // CHECK-ARM: @s1 ={{.*}} global i32 2 struct { char foo; long : 0; char : 0; int : 0; char bar; } ATTR t2; int s2 = sizeof(t2); // CHECK: @s2 ={{.*}} global i32 2 // CHECK-ARM: @s2 ={{.*}} global i32 2 struct { char foo; long : 0; char : 0; int : 0; char bar; long : 0; char : 0; } ATTR t3; int s3 = sizeof(t3); // CHECK: @s3 ={{.*}} global i32 2 // CHECK-ARM: @s3 ={{.*}} global i32 2 struct { long : 0; char bar; } ATTR t4; int s4 = sizeof(t4); // CHECK: @s4 ={{.*}} global i32 1 // CHECK-ARM: @s4 ={{.*}} global i32 1 struct { long : 0; long : 0; char : 0; char bar; } ATTR t5; int s5 = sizeof(t5); // CHECK: @s5 ={{.*}} global i32 1 // CHECK-ARM: @s5 ={{.*}} global i32 1 struct { long : 0; long : 0; char : 0; char bar; } ATTR t6; int s6 = sizeof(t6); // CHECK: @s6 ={{.*}} global i32 1 // CHECK-ARM: @s6 ={{.*}} global i32 1 struct { char foo; long : 0; int : 0; char bar; char bar1; long : 0; char bar2; char bar3; char : 0; char bar4; char bar5; char : 0; char bar6; char bar7; } ATTR t7; int s7 = sizeof(t7); // CHECK: @s7 ={{.*}} global i32 9 // CHECK-ARM: @s7 ={{.*}} global i32 9 struct { long : 0; long : 0; char : 0; } ATTR t8; int s8 = sizeof(t8); // CHECK: @s8 ={{.*}} global i32 0 // CHECK-ARM: @s8 ={{.*}} global i32 0 struct { char foo; long : 0; int : 0; char bar; char bar1; long : 0; char bar2; char bar3; char : 0; char bar4; char bar5; char : 0; char bar6; char bar7; int i1; char : 0; long : 0; char :4; char bar8; char : 0; char bar9; char bar10; int i2; char : 0; long : 0; char :4; } ATTR t9; int s9 = sizeof(t9); // CHECK: @s9 ={{.*}} global i32 28 // CHECK-ARM: @s9 ={{.*}} global i32 28 struct { char foo: 8; long : 0; char bar; } ATTR t10; int s10 = sizeof(t10); // CHECK: @s10 ={{.*}} global i32 16 // CHECK-ARM: @s10 ={{.*}} global i32 8 // rdar://16041826 - ensure that ms_structs work correctly on a // !useBitFieldTypeAlignment() target struct { unsigned int a : 31; unsigned int b : 2; unsigned int c; } ATTR t11; int s11 = sizeof(t11); // CHECK: @s11 ={{.*}} global i32 12 // CHECK-ARM: @s11 ={{.*}} global i32 12 struct { unsigned char a : 3; unsigned char b : 4; unsigned short c : 6; } ATTR t12; int s12 = sizeof(t12); // CHECK: @s12 ={{.*}} global i32 4 // CHECK-ARM: @s12 ={{.*}} global i32 4 struct { unsigned char a : 3; unsigned char b : 4; __attribute__((packed)) unsigned short c : 6; } ATTR t13; int s13 = sizeof(t13); // CHECK: @s13 ={{.*}} global i32 4 // CHECK-ARM: @s13 ={{.*}} global i32 4