Files
RedBear-OS/local/recipes/dev/libclc/source/clang/test/Layout/ms-x86-lazy-empty-nonvirtual-base.cpp
T
vasilito cb424d7448 build: static patch-sanity linter (shift-left the malformed-patch class)
verify-patch-sanity.py validates every active recipe .patch has internally-
consistent hunk line counts — catching the 'malformed patch at line N' failure
at commit/CI/preflight time instead of hours into a cook. This cycle hit that
class three times (qtwaylandscanner, sddm, xwayland), each only discovered when
cookbook tried to apply the patch.

Running it across the repo found 29 latent malformed patches (validated against
GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22').
They were harmless only because they sit in vendored recipes (baked, not re-
applied) — but would fail on any version-bump re-derivation. --fix recounts the
hunk headers (body untouched) and repaired all 29.

Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test
(test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats
(empty placeholders, bare-@@ git hunks).
2026-08-01 05:13:02 +03:00

737 lines
28 KiB
C++

// RUN: %clang_cc1 -fno-rtti -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
// RUN: | FileCheck %s --strict-whitespace
// RUN: %clang_cc1 -fno-rtti -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
// RUN: | FileCheck %s -check-prefix CHECK-X64 --strict-whitespace
extern "C" int printf(const char *fmt, ...);
struct B0 { B0() { printf("B0 = %p\n", this); } };
struct B1 { B1() { printf("B1 = %p\n", this); } };
struct B2 { B2() { printf("B2 = %p\n", this); } };
struct B3 { B3() { printf("B3 = %p\n", this); } };
struct B4 { B4() { printf("B4 = %p\n", this); } };
struct B5 { B5() { printf("B5 = %p\n", this); } };
struct __declspec(align(2)) B6 { B6() { printf("B6 = %p\n", this); } };
struct __declspec(align(16)) B7 { B7() { printf("B7 = %p\n", this); } };
struct B8 { char c[5]; B8() { printf("B8 = %p\n", this); } };
struct B9 { char c[6]; B9() { printf("B9 = %p\n", this); } };
struct B10 { char c[7]; B10() { printf("B10 = %p\n", this); } };
struct B11 { char c[8]; B11() { printf("B11 = %p\n", this); } };
struct B0X { B0X() { printf("B0 = %p\n", this); } };
struct B1X { B1X() { printf("B1 = %p\n", this); } };
struct __declspec(align(16)) B2X { B2X() { printf("B2 = %p\n", this); } };
struct __declspec(align(2)) B3X { B3X() { printf("B3 = %p\n", this); } };
struct B4X { B4X() { printf("B4 = %p\n", this); } };
struct B5X { B5X() { printf("B5 = %p\n", this); } };
struct B6X { B6X() { printf("B6 = %p\n", this); } };
struct B8X { short a; B8X() : a(0x000000B8) { printf("B8 = %p\n", this); } };
struct AA : B8, B1, virtual B0 {
int a;
AA() : a(0x000000AA) { printf("AA = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AA{{$}}
// CHECK-NEXT: 0 | struct B8 (base)
// CHECK-NEXT: 0 | char[5] c
// CHECK-NEXT: 13 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AA vbtable pointer)
// CHECK-NEXT: 16 | int a
// CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=20, align=4
// CHECK-NEXT: | nvsize=20, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AA{{$}}
// CHECK-X64-NEXT: 0 | struct B8 (base)
// CHECK-X64-NEXT: 0 | char[5] c
// CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AA vbtable pointer)
// CHECK-X64-NEXT: 20 | int a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AB : B8, B1, virtual B0 {
short a;
AB() : a(0x000000AB) { printf("AB = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AB{{$}}
// CHECK-NEXT: 0 | struct B8 (base)
// CHECK-NEXT: 0 | char[5] c
// CHECK-NEXT: 13 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AB vbtable pointer)
// CHECK-NEXT: 14 | short a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AB{{$}}
// CHECK-X64-NEXT: 0 | struct B8 (base)
// CHECK-X64-NEXT: 0 | char[5] c
// CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AB vbtable pointer)
// CHECK-X64-NEXT: 18 | short a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AC : B8, B1, virtual B0 {
char a;
AC() : a(0x000000AC) { printf("AC = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AC{{$}}
// CHECK-NEXT: 0 | struct B8 (base)
// CHECK-NEXT: 0 | char[5] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AC vbtable pointer)
// CHECK-NEXT: 12 | char a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AC{{$}}
// CHECK-X64-NEXT: 0 | struct B8 (base)
// CHECK-X64-NEXT: 0 | char[5] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AC vbtable pointer)
// CHECK-X64-NEXT: 16 | char a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AD : B8, B1, virtual B0 {
AD() { printf("AD = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AD{{$}}
// CHECK-NEXT: 0 | struct B8 (base)
// CHECK-NEXT: 0 | char[5] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AD vbtable pointer)
// CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=12, align=4
// CHECK-NEXT: | nvsize=12, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AD{{$}}
// CHECK-X64-NEXT: 0 | struct B8 (base)
// CHECK-X64-NEXT: 0 | char[5] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AD vbtable pointer)
// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=16, align=8
// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
struct AA1 : B9, B1, virtual B0 {
int a;
AA1() : a(0x00000AA1) { printf("AA1 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AA1{{$}}
// CHECK-NEXT: 0 | struct B9 (base)
// CHECK-NEXT: 0 | char[6] c
// CHECK-NEXT: 14 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AA1 vbtable pointer)
// CHECK-NEXT: 16 | int a
// CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=20, align=4
// CHECK-NEXT: | nvsize=20, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AA1{{$}}
// CHECK-X64-NEXT: 0 | struct B9 (base)
// CHECK-X64-NEXT: 0 | char[6] c
// CHECK-X64-NEXT: 18 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AA1 vbtable pointer)
// CHECK-X64-NEXT: 20 | int a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AB1 : B9, B1, virtual B0 {
short a;
AB1() : a(0x00000AB1) { printf("AB1 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AB1{{$}}
// CHECK-NEXT: 0 | struct B9 (base)
// CHECK-NEXT: 0 | char[6] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AB1 vbtable pointer)
// CHECK-NEXT: 12 | short a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AB1{{$}}
// CHECK-X64-NEXT: 0 | struct B9 (base)
// CHECK-X64-NEXT: 0 | char[6] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AB1 vbtable pointer)
// CHECK-X64-NEXT: 16 | short a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AC1 : B9, B1, virtual B0 {
char a;
AC1() : a(0x000000C1) { printf("AC1 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AC1{{$}}
// CHECK-NEXT: 0 | struct B9 (base)
// CHECK-NEXT: 0 | char[6] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AC1 vbtable pointer)
// CHECK-NEXT: 12 | char a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AC1{{$}}
// CHECK-X64-NEXT: 0 | struct B9 (base)
// CHECK-X64-NEXT: 0 | char[6] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AC1 vbtable pointer)
// CHECK-X64-NEXT: 16 | char a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AD1 : B9, B1, virtual B0 {
AD1() { printf("AD1 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AD1{{$}}
// CHECK-NEXT: 0 | struct B9 (base)
// CHECK-NEXT: 0 | char[6] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AD1 vbtable pointer)
// CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=12, align=4
// CHECK-NEXT: | nvsize=12, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AD1{{$}}
// CHECK-X64-NEXT: 0 | struct B9 (base)
// CHECK-X64-NEXT: 0 | char[6] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AD1 vbtable pointer)
// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=16, align=8
// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
struct AA2 : B10, B1, virtual B0 {
int a;
AA2() : a(0x00000AA2) { printf("AA2 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AA2{{$}}
// CHECK-NEXT: 0 | struct B10 (base)
// CHECK-NEXT: 0 | char[7] c
// CHECK-NEXT: 15 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AA2 vbtable pointer)
// CHECK-NEXT: 16 | int a
// CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=20, align=4
// CHECK-NEXT: | nvsize=20, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AA2{{$}}
// CHECK-X64-NEXT: 0 | struct B10 (base)
// CHECK-X64-NEXT: 0 | char[7] c
// CHECK-X64-NEXT: 19 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AA2 vbtable pointer)
// CHECK-X64-NEXT: 20 | int a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AB2 : B10, B1, virtual B0 {
short a;
AB2() : a(0x00000AB2) { printf("AB2 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AB2{{$}}
// CHECK-NEXT: 0 | struct B10 (base)
// CHECK-NEXT: 0 | char[7] c
// CHECK-NEXT: 13 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AB2 vbtable pointer)
// CHECK-NEXT: 14 | short a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AB2{{$}}
// CHECK-X64-NEXT: 0 | struct B10 (base)
// CHECK-X64-NEXT: 0 | char[7] c
// CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AB2 vbtable pointer)
// CHECK-X64-NEXT: 18 | short a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AC2 : B10, B1, virtual B0 {
char a;
AC2() : a(0x000000C2) { printf("AC2 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AC2{{$}}
// CHECK-NEXT: 0 | struct B10 (base)
// CHECK-NEXT: 0 | char[7] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AC2 vbtable pointer)
// CHECK-NEXT: 12 | char a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AC2{{$}}
// CHECK-X64-NEXT: 0 | struct B10 (base)
// CHECK-X64-NEXT: 0 | char[7] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AC2 vbtable pointer)
// CHECK-X64-NEXT: 16 | char a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AD2 : B10, B1, virtual B0 {
AD2() { printf("AD2 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AD2{{$}}
// CHECK-NEXT: 0 | struct B10 (base)
// CHECK-NEXT: 0 | char[7] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AD2 vbtable pointer)
// CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=12, align=4
// CHECK-NEXT: | nvsize=12, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AD2{{$}}
// CHECK-X64-NEXT: 0 | struct B10 (base)
// CHECK-X64-NEXT: 0 | char[7] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AD2 vbtable pointer)
// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=16, align=8
// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
struct AA3 : B11, B1, virtual B0 {
int a;
AA3() : a(0x00000AA3) { printf("AA3 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AA3{{$}}
// CHECK-NEXT: 0 | struct B11 (base)
// CHECK-NEXT: 0 | char[8] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AA3 vbtable pointer)
// CHECK-NEXT: 12 | int a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AA3{{$}}
// CHECK-X64-NEXT: 0 | struct B11 (base)
// CHECK-X64-NEXT: 0 | char[8] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AA3 vbtable pointer)
// CHECK-X64-NEXT: 16 | int a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AB3 : B11, B1, virtual B0 {
short a;
AB3() : a(0x00000AB3) { printf("AB3 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AB3{{$}}
// CHECK-NEXT: 0 | struct B11 (base)
// CHECK-NEXT: 0 | char[8] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AB3 vbtable pointer)
// CHECK-NEXT: 12 | short a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AB3{{$}}
// CHECK-X64-NEXT: 0 | struct B11 (base)
// CHECK-X64-NEXT: 0 | char[8] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AB3 vbtable pointer)
// CHECK-X64-NEXT: 16 | short a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AC3 : B11, B1, virtual B0 {
char a;
AC3() : a(0x000000C3) { printf("AC3 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AC3{{$}}
// CHECK-NEXT: 0 | struct B11 (base)
// CHECK-NEXT: 0 | char[8] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AC3 vbtable pointer)
// CHECK-NEXT: 12 | char a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AC3{{$}}
// CHECK-X64-NEXT: 0 | struct B11 (base)
// CHECK-X64-NEXT: 0 | char[8] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AC3 vbtable pointer)
// CHECK-X64-NEXT: 16 | char a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct AD3 : B11, B1, virtual B0 {
AD3() { printf("AD3 = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AD3{{$}}
// CHECK-NEXT: 0 | struct B11 (base)
// CHECK-NEXT: 0 | char[8] c
// CHECK-NEXT: 12 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (AD3 vbtable pointer)
// CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=12, align=4
// CHECK-NEXT: | nvsize=12, nvalign=4]
// CHECK-X64-LABEL: 0 | struct AD3{{$}}
// CHECK-X64-NEXT: 0 | struct B11 (base)
// CHECK-X64-NEXT: 0 | char[8] c
// CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (AD3 vbtable pointer)
// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=16, align=8
// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
struct B : B1, B2, virtual B0 {
B() { printf("B = %p\n", this); }
};
// CHECK-LABEL: 0 | struct B{{$}}
// CHECK-NEXT: 0 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | struct B2 (base) (empty)
// CHECK-NEXT: 4 | (B vbtable pointer)
// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=8, align=4
// CHECK-NEXT: | nvsize=8, nvalign=4]
// CHECK-X64-LABEL: 0 | struct B{{$}}
// CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 16 | struct B2 (base) (empty)
// CHECK-X64-NEXT: 8 | (B vbtable pointer)
// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=16, align=8
// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
struct C : B1, B2, B3, virtual B0 {
char a;
C() : a(0x0000000C) { printf("C = %p\n", this); }
};
// CHECK-LABEL: 0 | struct C{{$}}
// CHECK-NEXT: 0 | struct B1 (base) (empty)
// CHECK-NEXT: 1 | struct B2 (base) (empty)
// CHECK-NEXT: 8 | struct B3 (base) (empty)
// CHECK-NEXT: 4 | (C vbtable pointer)
// CHECK-NEXT: 8 | char a
// CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=12, align=4
// CHECK-NEXT: | nvsize=12, nvalign=4]
// CHECK-X64-LABEL: 0 | struct C{{$}}
// CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 1 | struct B2 (base) (empty)
// CHECK-X64-NEXT: 16 | struct B3 (base) (empty)
// CHECK-X64-NEXT: 8 | (C vbtable pointer)
// CHECK-X64-NEXT: 16 | char a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct D : B1, B2, B3, B4, B5, virtual B0 {
int a;
D() : a(0x0000000D) { printf("D = %p\n", this); }
};
// CHECK-LABEL: 0 | struct D{{$}}
// CHECK-NEXT: 0 | struct B1 (base) (empty)
// CHECK-NEXT: 1 | struct B2 (base) (empty)
// CHECK-NEXT: 2 | struct B3 (base) (empty)
// CHECK-NEXT: 3 | struct B4 (base) (empty)
// CHECK-NEXT: 8 | struct B5 (base) (empty)
// CHECK-NEXT: 4 | (D vbtable pointer)
// CHECK-NEXT: 8 | int a
// CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=12, align=4
// CHECK-NEXT: | nvsize=12, nvalign=4]
// CHECK-X64-LABEL: 0 | struct D{{$}}
// CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 1 | struct B2 (base) (empty)
// CHECK-X64-NEXT: 2 | struct B3 (base) (empty)
// CHECK-X64-NEXT: 3 | struct B4 (base) (empty)
// CHECK-X64-NEXT: 16 | struct B5 (base) (empty)
// CHECK-X64-NEXT: 8 | (D vbtable pointer)
// CHECK-X64-NEXT: 16 | int a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct E : B1, B6, B3, B4, B5, virtual B0 {
int a;
E() : a(0x0000000E) { printf("E = %p\n", this); }
};
// CHECK-LABEL: 0 | struct E{{$}}
// CHECK-NEXT: 0 | struct B1 (base) (empty)
// CHECK-NEXT: 2 | struct B6 (base) (empty)
// CHECK-NEXT: 3 | struct B3 (base) (empty)
// CHECK-NEXT: 4 | struct B4 (base) (empty)
// CHECK-NEXT: 13 | struct B5 (base) (empty)
// CHECK-NEXT: 8 | (E vbtable pointer)
// CHECK-NEXT: 16 | int a
// CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=20, align=4
// CHECK-NEXT: | nvsize=20, nvalign=4]
// CHECK-X64-LABEL: 0 | struct E{{$}}
// CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 2 | struct B6 (base) (empty)
// CHECK-X64-NEXT: 3 | struct B3 (base) (empty)
// CHECK-X64-NEXT: 4 | struct B4 (base) (empty)
// CHECK-X64-NEXT: 17 | struct B5 (base) (empty)
// CHECK-X64-NEXT: 8 | (E vbtable pointer)
// CHECK-X64-NEXT: 20 | int a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct F : B1, B6, B4, B8, B5, virtual B0 {
int a;
F() : a(0x0000000F) { printf("&a = %p\n", &a); printf("F = %p\n", this); }
};
// CHECK-LABEL: 0 | struct F{{$}}
// CHECK-NEXT: 0 | struct B1 (base) (empty)
// CHECK-NEXT: 2 | struct B6 (base) (empty)
// CHECK-NEXT: 3 | struct B4 (base) (empty)
// CHECK-NEXT: 3 | struct B8 (base)
// CHECK-NEXT: 3 | char[5] c
// CHECK-NEXT: 12 | struct B5 (base) (empty)
// CHECK-NEXT: 8 | (F vbtable pointer)
// CHECK-NEXT: 12 | int a
// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct F{{$}}
// CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 2 | struct B6 (base) (empty)
// CHECK-X64-NEXT: 3 | struct B4 (base) (empty)
// CHECK-X64-NEXT: 3 | struct B8 (base)
// CHECK-X64-NEXT: 3 | char[5] c
// CHECK-X64-NEXT: 16 | struct B5 (base) (empty)
// CHECK-X64-NEXT: 8 | (F vbtable pointer)
// CHECK-X64-NEXT: 16 | int a
// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct G : B8, B1, virtual B0 {
int a;
__declspec(align(16)) int a1;
G() : a(0x00000010), a1(0xf0000010) { printf("G = %p\n", this); }
};
// CHECK-LABEL: 0 | struct G{{$}}
// CHECK-NEXT: 0 | struct B8 (base)
// CHECK-NEXT: 0 | char[5] c
// CHECK-NEXT: 21 | struct B1 (base) (empty)
// CHECK-NEXT: 8 | (G vbtable pointer)
// CHECK-NEXT: 24 | int a
// CHECK-NEXT: 32 | int a1
// CHECK-NEXT: 48 | struct B0 (virtual base) (empty)
// CHECK-NEXT: | [sizeof=48, align=16
// CHECK-NEXT: | nvsize=48, nvalign=16]
// CHECK-X64-LABEL: 0 | struct G{{$}}
// CHECK-X64-NEXT: 0 | struct B8 (base)
// CHECK-X64-NEXT: 0 | char[5] c
// CHECK-X64-NEXT: 21 | struct B1 (base) (empty)
// CHECK-X64-NEXT: 8 | (G vbtable pointer)
// CHECK-X64-NEXT: 24 | int a
// CHECK-X64-NEXT: 32 | int a1
// CHECK-X64-NEXT: 48 | struct B0 (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=48, align=16
// CHECK-X64-NEXT: | nvsize=48, nvalign=16]
struct AX : B1X, B2X, B3X, B4X, virtual B0X {
int a;
AX() : a(0x0000000A) { printf(" A = %p\n", this); }
};
// CHECK-LABEL: 0 | struct AX{{$}}
// CHECK-NEXT: 0 | struct B1X (base) (empty)
// CHECK-NEXT: 16 | struct B2X (base) (empty)
// CHECK-NEXT: 18 | struct B3X (base) (empty)
// CHECK-NEXT: 35 | struct B4X (base) (empty)
// CHECK-NEXT: 20 | (AX vbtable pointer)
// CHECK-NEXT: 36 | int a
// CHECK-NEXT: 48 | struct B0X (virtual base) (empty)
// CHECK-NEXT: | [sizeof=48, align=16
// CHECK-NEXT: | nvsize=48, nvalign=16]
// CHECK-X64-LABEL: 0 | struct AX{{$}}
// CHECK-X64-NEXT: 0 | struct B1X (base) (empty)
// CHECK-X64-NEXT: 16 | struct B2X (base) (empty)
// CHECK-X64-NEXT: 18 | struct B3X (base) (empty)
// CHECK-X64-NEXT: 35 | struct B4X (base) (empty)
// CHECK-X64-NEXT: 24 | (AX vbtable pointer)
// CHECK-X64-NEXT: 36 | int a
// CHECK-X64-NEXT: 48 | struct B0X (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=48, align=16
// CHECK-X64-NEXT: | nvsize=48, nvalign=16]
struct BX : B2X, B1X, B3X, B4X, virtual B0X {
int a;
BX() : a(0x0000000B) { printf(" B = %p\n", this); }
};
// CHECK-LABEL: 0 | struct BX{{$}}
// CHECK-NEXT: 0 | struct B2X (base) (empty)
// CHECK-NEXT: 1 | struct B1X (base) (empty)
// CHECK-NEXT: 2 | struct B3X (base) (empty)
// CHECK-NEXT: 19 | struct B4X (base) (empty)
// CHECK-NEXT: 4 | (BX vbtable pointer)
// CHECK-NEXT: 20 | int a
// CHECK-NEXT: 32 | struct B0X (virtual base) (empty)
// CHECK-NEXT: | [sizeof=32, align=16
// CHECK-NEXT: | nvsize=32, nvalign=16]
// CHECK-X64-LABEL: 0 | struct BX{{$}}
// CHECK-X64-NEXT: 0 | struct B2X (base) (empty)
// CHECK-X64-NEXT: 1 | struct B1X (base) (empty)
// CHECK-X64-NEXT: 2 | struct B3X (base) (empty)
// CHECK-X64-NEXT: 19 | struct B4X (base) (empty)
// CHECK-X64-NEXT: 8 | (BX vbtable pointer)
// CHECK-X64-NEXT: 20 | int a
// CHECK-X64-NEXT: 32 | struct B0X (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=32, align=16
// CHECK-X64-NEXT: | nvsize=32, nvalign=16]
struct CX : B1X, B3X, B2X, virtual B0X {
int a;
CX() : a(0x0000000C) { printf(" C = %p\n", this); }
};
// CHECK-LABEL: 0 | struct CX{{$}}
// CHECK-NEXT: 0 | struct B1X (base) (empty)
// CHECK-NEXT: 2 | struct B3X (base) (empty)
// CHECK-NEXT: 32 | struct B2X (base) (empty)
// CHECK-NEXT: 16 | (CX vbtable pointer)
// CHECK-NEXT: 32 | int a
// CHECK-NEXT: 48 | struct B0X (virtual base) (empty)
// CHECK-NEXT: | [sizeof=48, align=16
// CHECK-NEXT: | nvsize=48, nvalign=16]
// CHECK-X64-LABEL: 0 | struct CX{{$}}
// CHECK-X64-NEXT: 0 | struct B1X (base) (empty)
// CHECK-X64-NEXT: 2 | struct B3X (base) (empty)
// CHECK-X64-NEXT: 32 | struct B2X (base) (empty)
// CHECK-X64-NEXT: 16 | (CX vbtable pointer)
// CHECK-X64-NEXT: 32 | int a
// CHECK-X64-NEXT: 48 | struct B0X (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=48, align=16
// CHECK-X64-NEXT: | nvsize=48, nvalign=16]
struct DX : B8X, B1X, virtual B0X {
int a;
DX() : a(0x0000000D) { printf(" D = %p\n", this); }
};
// CHECK-LABEL: 0 | struct DX{{$}}
// CHECK-NEXT: 0 | struct B8X (base)
// CHECK-NEXT: 0 | short a
// CHECK-NEXT: 10 | struct B1X (base) (empty)
// CHECK-NEXT: 4 | (DX vbtable pointer)
// CHECK-NEXT: 12 | int a
// CHECK-NEXT: 16 | struct B0X (virtual base) (empty)
// CHECK-NEXT: | [sizeof=16, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct DX{{$}}
// CHECK-X64-NEXT: 0 | struct B8X (base)
// CHECK-X64-NEXT: 0 | short a
// CHECK-X64-NEXT: 18 | struct B1X (base) (empty)
// CHECK-X64-NEXT: 8 | (DX vbtable pointer)
// CHECK-X64-NEXT: 20 | int a
// CHECK-X64-NEXT: 24 | struct B0X (virtual base) (empty)
// CHECK-X64-NEXT: | [sizeof=24, align=8
// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
struct C0 {};
struct C1 : public C0 { int C1F0; };
struct C2 : public C1, public C0 {};
// CHECK-LABEL: 0 | struct C2{{$}}
// CHECK-NEXT: 0 | struct C1 (base)
// CHECK-NEXT: 0 | struct C0 (base) (empty)
// CHECK-NEXT: 0 | int C1F0
// CHECK-NEXT: 5 | struct C0 (base) (empty)
// CHECK-NEXT: | [sizeof=8, align=4
// CHECK-NEXT: | nvsize=8, nvalign=4]
// CHECK-X64-LABEL: 0 | struct C2{{$}}
// CHECK-X64-NEXT: 0 | struct C1 (base)
// CHECK-X64-NEXT: 0 | struct C0 (base) (empty)
// CHECK-X64-NEXT: 0 | int C1F0
// CHECK-X64-NEXT: 5 | struct C0 (base) (empty)
// CHECK-X64-NEXT: | [sizeof=8, align=4
// CHECK-X64-NEXT: | nvsize=8, nvalign=4]
struct JA { char a; };
struct JB {
char a;
virtual void f() {}
};
struct JC { char a; };
struct JD : JA, JB, virtual JC {};
// CHECK-LABEL: 0 | struct JD{{$}}
// CHECK-NEXT: 0 | struct JB (primary base)
// CHECK-NEXT: 0 | (JB vftable pointer)
// CHECK-NEXT: 4 | char a
// CHECK-NEXT: 12 | struct JA (base)
// CHECK-NEXT: 12 | char a
// CHECK-NEXT: 8 | (JD vbtable pointer)
// CHECK-NEXT: 16 | struct JC (virtual base)
// CHECK-NEXT: 16 | char a
// CHECK-NEXT: | [sizeof=17, align=4
// CHECK-NEXT: | nvsize=16, nvalign=4]
// CHECK-X64-LABEL: 0 | struct JD{{$}}
// CHECK-X64-NEXT: 0 | struct JB (primary base)
// CHECK-X64-NEXT: 0 | (JB vftable pointer)
// CHECK-X64-NEXT: 8 | char a
// CHECK-X64-NEXT: 24 | struct JA (base)
// CHECK-X64-NEXT: 24 | char a
// CHECK-X64-NEXT: 16 | (JD vbtable pointer)
// CHECK-X64-NEXT: 32 | struct JC (virtual base)
// CHECK-X64-NEXT: 32 | char a
// CHECK-X64-NEXT: | [sizeof=40, align=8
// CHECK-X64-NEXT: | nvsize=32, nvalign=8]
int a[
sizeof(AA)+
sizeof(AB)+
sizeof(AC)+
sizeof(AD)+
sizeof(AA1)+
sizeof(AB1)+
sizeof(AC1)+
sizeof(AD1)+
sizeof(AA2)+
sizeof(AB2)+
sizeof(AC2)+
sizeof(AD2)+
sizeof(AA3)+
sizeof(AB3)+
sizeof(AC3)+
sizeof(AD3)+
sizeof(B)+
sizeof(C)+
sizeof(D)+
sizeof(E)+
sizeof(F)+
sizeof(G)+
sizeof(AX)+
sizeof(BX)+
sizeof(CX)+
sizeof(DX)+
sizeof(C2)+
sizeof(JD)+
0];