Compiler projects using llvm
// RUN: %clang_cc1 -emit-llvm-only -triple s390x-none-zos -fdump-record-layouts %s | FileCheck %s --check-prefix=CHECK
// RUN: %clang_cc1 -emit-llvm -triple s390x-none-zos %s -o - | FileCheck %s --check-prefix=DECL

static int __attribute__((aligned(32))) v0;
int __attribute__((aligned(32))) v1;
typedef int __attribute__((aligned(32))) int32;
static int32 v2;
int32 v3;
int f0(void) { return v0 + v1 + v2 + v3; }
// DECL:      @v0 {{.*}} align 16
// DECL-NEXT: @v1 {{.*}} align 32
// DECL-NEXT: @v2 {{.*}} align 16
// DECL-NEXT: @v3 {{.*}} align 32

const struct cs0 {
  unsigned long : 0;
  long long a;
} CS0 = {};
// CHECK:              0 | struct cs0
// CHECK-NEXT:       0:- |   unsigned long
// CHECK-NEXT:         0 |   long long a
// CHECK-NEXT:           | [sizeof=8, align=8]

volatile struct vs0 {
  long : 0;
  short a;
} VS0;
// CHECK:              0 | struct vs0
// CHECK-NEXT:       0:- |   long
// CHECK-NEXT:         0 |   short a
// CHECK-NEXT:           | [sizeof=2, align=2]

struct s0 {
  short a : 3;
  long b : 5;
  int c : 1;
  long d : 10;
  char e : 5;
} S0;
// CHECK:              0 | struct s0
// CHECK-NEXT:     0:0-2 |   short a
// CHECK-NEXT:     0:3-7 |   long b
// CHECK-NEXT:     1:0-0 |   int c
// CHECK-NEXT:    1:1-10 |   long d
// CHECK-NEXT:     2:3-7 |   char e
// CHECK-NEXT:           | [sizeof=3, align=1]

struct s1 {
  char a : 7;
  long b : 27;
  int c : 2;
} S1;
// CHECK:              0 | struct s1
// CHECK-NEXT:     0:0-6 |   char a
// CHECK-NEXT:    0:7-33 |   long b
// CHECK-NEXT:     4:2-3 |   int c
// CHECK-NEXT:           | [sizeof=5, align=1]

struct s2 {
  char a : 7;
  char : 0;
  short : 0;
  short : 0;
} S2;
// CHECK:              0 | struct s2
// CHECK-NEXT:     0:0-6 |   char a
// CHECK-NEXT:       4:- |   char
// CHECK-NEXT:       4:- |   short
// CHECK-NEXT:       4:- |   short
// CHECK-NEXT:           | [sizeof=4, align=4]

struct s3 {
  int a;
  int b : 16;
  char : 0;
  char c : 1;
} S3;
// CHECK:              0 | struct s3
// CHECK-NEXT:         0 |   int a
// CHECK-NEXT:    4:0-15 |   int b
// CHECK-NEXT:       8:- |   char
// CHECK-NEXT:     8:0-0 |   char c
// CHECK-NEXT:           | [sizeof=12, align=4]

struct s4 {
  unsigned int __attribute__((aligned(32))) a;
} S4;
// CHECK:              0 | struct s4
// CHECK-NEXT:         0 |   unsigned int a
// CHECK-NEXT:           | [sizeof=32, align=32]

struct s5 {
  char a;
  int b : 19 __attribute__((aligned(4)));
  int c : 22 __attribute__((aligned(8)));
  int : 0;
  int d : 10;
} S5;
// CHECK:              0 | struct s5
// CHECK-NEXT:         0 |   char a
// CHECK-NEXT:    4:0-18 |   int b
// CHECK-NEXT:    8:0-21 |   int c
// CHECK-NEXT:      12:- |   int
// CHECK-NEXT:    12:0-9 |   int d
// CHECK-NEXT:           | [sizeof=16, align=8]

struct s6 {
  char *a;
  char *b[];
} S6;
// CHECK:              0 | struct s6
// CHECK-NEXT:         0 |   char * a
// CHECK-NEXT:         8 |   char *[] b
// CHECK-NEXT:           | [sizeof=8, align=8]

struct s7 {
  long : 0;
  short a;
} S7;
// CHECK:              0 | struct s7
// CHECK-NEXT:       0:- |   long
// CHECK-NEXT:         0 |   short a
// CHECK-NEXT:           | [sizeof=2, align=2]

#pragma pack(2)
struct s8 {
  unsigned long : 0;
  long long a;
} S8;
#pragma pack()
// CHECK:              0 | struct s8
// CHECK-NEXT:       0:- |   unsigned long
// CHECK-NEXT:         0 |   long long a
// CHECK-NEXT:           | [sizeof=8, align=2]

struct s9 {
  unsigned int : 0;
  unsigned short : 0;
} S9;
// CHECK:              0 | struct s9
// CHECK-NEXT:       0:- |   unsigned int
// CHECK-NEXT:       0:- |   unsigned short
// CHECK-NEXT:           | [sizeof=0, align=1]

struct s10 {
  unsigned int __attribute__((aligned)) a;
} S10;
// CHECK:              0 | struct s10
// CHECK-NEXT:         0 |   unsigned int a
// CHECK-NEXT:           | [sizeof=8, align=8]

struct s11 {
  char a;
  long : 0;
  char b;
} S11;
// CHECK:              0 | struct s11
// CHECK-NEXT:         0 |   char a
// CHECK-NEXT:       8:- |   long
// CHECK-NEXT:         8 |   char b
// CHECK-NEXT:           | [sizeof=16, align=8]

union u0 {
  unsigned short d1 __attribute__((packed));
  int d2 : 10;
  long d3;
} U0 __attribute__((aligned(8)));
// CHECK:              0 | union u0
// CHECK-NEXT:         0 |   unsigned short d1
// CHECK-NEXT:     0:0-9 |   int d2
// CHECK-NEXT:         0 |   long d3
// CHECK-NEXT:           | [sizeof=8, align=8]

union u1 {
  unsigned int : 0;
  short a;
} U1;
// CHECK:              0 | union u1
// CHECK-NEXT:       0:- |   unsigned int
// CHECK-NEXT:         0 |   short a
// CHECK-NEXT:           | [sizeof=4, align=4]

union u2 {
  long : 0;
  short a;
} U2;
// CHECK:              0 | union u2
// CHECK-NEXT:       0:- |   long
// CHECK-NEXT:         0 |   short a
// CHECK-NEXT:           | [sizeof=8, align=8]

union u3 {
  unsigned char : 0;
  unsigned short : 0;
} U3;
// CHECK:              0 | union u3
// CHECK-NEXT:       0:- |   unsigned char
// CHECK-NEXT:       0:- |   unsigned short
// CHECK-NEXT:           | [sizeof=0, align=4]