// 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] struct s12 { __int128_t a; } S12; // CHECK: 0 | struct s12 // CHECK-NEXT: 0 | __int128_t a // 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]