ms-x86-empty-virtual-base.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
  2. // RUN: | FileCheck %s
  3. // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
  4. // RUN: | FileCheck %s -check-prefix CHECK-X64
  5. extern "C" int printf(const char *fmt, ...);
  6. struct __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  7. struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  8. struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  9. struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  10. struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  11. struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  12. struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  13. struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  14. struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  15. struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  16. struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };
  17. struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  18. struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
  19. struct A : virtual B0 {
  20. int a;
  21. A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  22. };
  23. // CHECK: *** Dumping AST Record Layout
  24. // CHECK: *** Dumping AST Record Layout
  25. // CHECK-NEXT: 0 | struct A
  26. // CHECK-NEXT: 0 | (A vbtable pointer)
  27. // CHECK-NEXT: 4 | int a
  28. // CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
  29. // CHECK-NEXT: | [sizeof=8, align=8
  30. // CHECK-NEXT: | nvsize=8, nvalign=8]
  31. // CHECK-X64: *** Dumping AST Record Layout
  32. // CHECK-X64: *** Dumping AST Record Layout
  33. // CHECK-X64-NEXT: 0 | struct A
  34. // CHECK-X64-NEXT: 0 | (A vbtable pointer)
  35. // CHECK-X64-NEXT: 8 | int a
  36. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  37. // CHECK-X64-NEXT: | [sizeof=16, align=8
  38. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  39. struct B : virtual B0 {
  40. B0 b0;
  41. int a;
  42. B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  43. };
  44. // CHECK: *** Dumping AST Record Layout
  45. // CHECK-NEXT: 0 | struct B
  46. // CHECK-NEXT: 0 | (B vbtable pointer)
  47. // CHECK-NEXT: 8 | struct B0 b0 (empty)
  48. // CHECK: 16 | int a
  49. // CHECK-NEXT: 24 | struct B0 (virtual base) (empty)
  50. // CHECK-NEXT: | [sizeof=24, align=8
  51. // CHECK-NEXT: | nvsize=24, nvalign=8]
  52. // CHECK-X64: *** Dumping AST Record Layout
  53. // CHECK-X64-NEXT: 0 | struct B
  54. // CHECK-X64-NEXT: 0 | (B vbtable pointer)
  55. // CHECK-X64-NEXT: 8 | struct B0 b0 (empty)
  56. // CHECK-X64: 16 | int a
  57. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  58. // CHECK-X64-NEXT: | [sizeof=24, align=8
  59. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  60. struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
  61. int a;
  62. C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  63. };
  64. // CHECK: *** Dumping AST Record Layout
  65. // CHECK: *** Dumping AST Record Layout
  66. // CHECK: *** Dumping AST Record Layout
  67. // CHECK: *** Dumping AST Record Layout
  68. // CHECK: *** Dumping AST Record Layout
  69. // CHECK-NEXT: 0 | struct C
  70. // CHECK-NEXT: 0 | (C vbtable pointer)
  71. // CHECK-NEXT: 4 | int a
  72. // CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
  73. // CHECK-NEXT: 16 | struct B1 (virtual base) (empty)
  74. // CHECK-NEXT: 24 | struct B2 (virtual base) (empty)
  75. // CHECK-NEXT: 32 | struct B3 (virtual base) (empty)
  76. // CHECK-NEXT: 40 | struct B4 (virtual base) (empty)
  77. // CHECK-NEXT: | [sizeof=40, align=8
  78. // CHECK-NEXT: | nvsize=8, nvalign=8]
  79. // CHECK-X64: *** Dumping AST Record Layout
  80. // CHECK-X64: *** Dumping AST Record Layout
  81. // CHECK-X64: *** Dumping AST Record Layout
  82. // CHECK-X64: *** Dumping AST Record Layout
  83. // CHECK-X64: *** Dumping AST Record Layout
  84. // CHECK-X64-NEXT: 0 | struct C
  85. // CHECK-X64-NEXT: 0 | (C vbtable pointer)
  86. // CHECK-X64-NEXT: 8 | int a
  87. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  88. // CHECK-X64-NEXT: 24 | struct B1 (virtual base) (empty)
  89. // CHECK-X64-NEXT: 32 | struct B2 (virtual base) (empty)
  90. // CHECK-X64-NEXT: 40 | struct B3 (virtual base) (empty)
  91. // CHECK-X64-NEXT: 48 | struct B4 (virtual base) (empty)
  92. // CHECK-X64-NEXT: | [sizeof=48, align=8
  93. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  94. struct D {
  95. B0 b0;
  96. C0 c0;
  97. C1 c1;
  98. C2 c2;
  99. B1 b1;
  100. int a;
  101. D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  102. };
  103. // CHECK: *** Dumping AST Record Layout
  104. // CHECK: *** Dumping AST Record Layout
  105. // CHECK: *** Dumping AST Record Layout
  106. // CHECK: *** Dumping AST Record Layout
  107. // CHECK-NEXT: 0 | struct D
  108. // CHECK-NEXT: 0 | struct B0 b0 (empty)
  109. // CHECK: 8 | struct C0 c0
  110. // CHECK-NEXT: 8 | int a
  111. // CHECK: 12 | struct C1 c1
  112. // CHECK-NEXT: 12 | int a
  113. // CHECK: 16 | struct C2 c2
  114. // CHECK-NEXT: 16 | int a
  115. // CHECK: 24 | struct B1 b1 (empty)
  116. // CHECK: 32 | int a
  117. // CHECK-NEXT: | [sizeof=40, align=8
  118. // CHECK-NEXT: | nvsize=40, nvalign=8]
  119. // CHECK-X64: *** Dumping AST Record Layout
  120. // CHECK-X64: *** Dumping AST Record Layout
  121. // CHECK-X64: *** Dumping AST Record Layout
  122. // CHECK-X64: *** Dumping AST Record Layout
  123. // CHECK-X64-NEXT: 0 | struct D
  124. // CHECK-X64-NEXT: 0 | struct B0 b0 (empty)
  125. // CHECK-X64: 8 | struct C0 c0
  126. // CHECK-X64-NEXT: 8 | int a
  127. // CHECK-X64: 12 | struct C1 c1
  128. // CHECK-X64-NEXT: 12 | int a
  129. // CHECK-X64: 16 | struct C2 c2
  130. // CHECK-X64-NEXT: 16 | int a
  131. // CHECK-X64: 24 | struct B1 b1 (empty)
  132. // CHECK-X64: 32 | int a
  133. // CHECK-X64-NEXT: | [sizeof=40, align=8
  134. // CHECK-X64-NEXT: | nvsize=40, nvalign=8]
  135. struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
  136. int a;
  137. E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  138. };
  139. // CHECK: *** Dumping AST Record Layout
  140. // CHECK-NEXT: 0 | struct E
  141. // CHECK-NEXT: 0 | (E vbtable pointer)
  142. // CHECK-NEXT: 4 | int a
  143. // CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
  144. // CHECK-NEXT: 8 | struct C0 (virtual base)
  145. // CHECK-NEXT: 8 | int a
  146. // CHECK-NEXT: 12 | struct C1 (virtual base)
  147. // CHECK-NEXT: 12 | int a
  148. // CHECK-NEXT: 16 | struct C2 (virtual base)
  149. // CHECK-NEXT: 16 | int a
  150. // CHECK-NEXT: 24 | struct B1 (virtual base) (empty)
  151. // CHECK-NEXT: | [sizeof=24, align=8
  152. // CHECK-NEXT: | nvsize=8, nvalign=8]
  153. // CHECK-X64: *** Dumping AST Record Layout
  154. // CHECK-X64-NEXT: 0 | struct E
  155. // CHECK-X64-NEXT: 0 | (E vbtable pointer)
  156. // CHECK-X64-NEXT: 8 | int a
  157. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  158. // CHECK-X64-NEXT: 16 | struct C0 (virtual base)
  159. // CHECK-X64-NEXT: 16 | int a
  160. // CHECK-X64-NEXT: 20 | struct C1 (virtual base)
  161. // CHECK-X64-NEXT: 20 | int a
  162. // CHECK-X64-NEXT: 24 | struct C2 (virtual base)
  163. // CHECK-X64-NEXT: 24 | int a
  164. // CHECK-X64-NEXT: 32 | struct B1 (virtual base) (empty)
  165. // CHECK-X64-NEXT: | [sizeof=32, align=8
  166. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  167. struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
  168. int a;
  169. F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  170. };
  171. // CHECK: *** Dumping AST Record Layout
  172. // CHECK-NEXT: 0 | struct F
  173. // CHECK-NEXT: 0 | (F vbtable pointer)
  174. // CHECK-NEXT: 4 | int a
  175. // CHECK-NEXT: 8 | struct C0 (virtual base)
  176. // CHECK-NEXT: 8 | int a
  177. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  178. // CHECK-NEXT: 24 | struct B1 (virtual base) (empty)
  179. // CHECK-NEXT: 24 | struct C1 (virtual base)
  180. // CHECK-NEXT: 24 | int a
  181. // CHECK-NEXT: | [sizeof=32, align=8
  182. // CHECK-NEXT: | nvsize=8, nvalign=8]
  183. // CHECK-X64: *** Dumping AST Record Layout
  184. // CHECK-X64-NEXT: 0 | struct F
  185. // CHECK-X64-NEXT: 0 | (F vbtable pointer)
  186. // CHECK-X64-NEXT: 8 | int a
  187. // CHECK-X64-NEXT: 16 | struct C0 (virtual base)
  188. // CHECK-X64-NEXT: 16 | int a
  189. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  190. // CHECK-X64-NEXT: 32 | struct B1 (virtual base) (empty)
  191. // CHECK-X64-NEXT: 32 | struct C1 (virtual base)
  192. // CHECK-X64-NEXT: 32 | int a
  193. // CHECK-X64-NEXT: | [sizeof=40, align=8
  194. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  195. struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
  196. int a;
  197. G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  198. virtual void f() {}
  199. };
  200. // CHECK: *** Dumping AST Record Layout
  201. // CHECK: *** Dumping AST Record Layout
  202. // CHECK-NEXT: 0 | struct G
  203. // CHECK-NEXT: 0 | struct D0 (primary base)
  204. // CHECK-NEXT: 0 | (D0 vftable pointer)
  205. // CHECK-NEXT: 4 | (G vbtable pointer)
  206. // CHECK-NEXT: 20 | int a
  207. // CHECK-NEXT: 32 | struct C0 (virtual base)
  208. // CHECK-NEXT: 32 | int a
  209. // CHECK-NEXT: 40 | struct B0 (virtual base) (empty)
  210. // CHECK-NEXT: 56 | struct B1 (virtual base) (empty)
  211. // CHECK-NEXT: 56 | struct C1 (virtual base)
  212. // CHECK-NEXT: 56 | int a
  213. // CHECK-NEXT: | [sizeof=64, align=16
  214. // CHECK-NEXT: | nvsize=32, nvalign=16]
  215. // CHECK-X64: *** Dumping AST Record Layout
  216. // CHECK-X64: *** Dumping AST Record Layout
  217. // CHECK-X64-NEXT: 0 | struct G
  218. // CHECK-X64-NEXT: 0 | struct D0 (primary base)
  219. // CHECK-X64-NEXT: 0 | (D0 vftable pointer)
  220. // CHECK-X64-NEXT: 8 | (G vbtable pointer)
  221. // CHECK-X64-NEXT: 24 | int a
  222. // CHECK-X64-NEXT: 32 | struct C0 (virtual base)
  223. // CHECK-X64-NEXT: 32 | int a
  224. // CHECK-X64-NEXT: 40 | struct B0 (virtual base) (empty)
  225. // CHECK-X64-NEXT: 56 | struct B1 (virtual base) (empty)
  226. // CHECK-X64-NEXT: 56 | struct C1 (virtual base)
  227. // CHECK-X64-NEXT: 56 | int a
  228. // CHECK-X64-NEXT: | [sizeof=64, align=16
  229. // CHECK-X64-NEXT: | nvsize=32, nvalign=16]
  230. struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
  231. int a;
  232. H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  233. virtual void f() {}
  234. };
  235. // CHECK: *** Dumping AST Record Layout
  236. // CHECK-NEXT: 0 | struct H
  237. // CHECK-NEXT: 0 | (H vbtable pointer)
  238. // CHECK-NEXT: 4 | int a
  239. // CHECK-NEXT: 8 | struct C0 (virtual base)
  240. // CHECK-NEXT: 8 | int a
  241. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  242. // CHECK-NEXT: 24 | struct B1 (virtual base) (empty)
  243. // CHECK-NEXT: 44 | (vtordisp for vbase D0)
  244. // CHECK-NEXT: 48 | struct D0 (virtual base)
  245. // CHECK-NEXT: 48 | (D0 vftable pointer)
  246. // CHECK-NEXT: 52 | struct C1 (virtual base)
  247. // CHECK-NEXT: 52 | int a
  248. // CHECK-NEXT: | [sizeof=64, align=16
  249. // CHECK-NEXT: | nvsize=8, nvalign=16]
  250. // CHECK-X64: *** Dumping AST Record Layout
  251. // CHECK-X64-NEXT: 0 | struct H
  252. // CHECK-X64-NEXT: 0 | (H vbtable pointer)
  253. // CHECK-X64-NEXT: 8 | int a
  254. // CHECK-X64-NEXT: 16 | struct C0 (virtual base)
  255. // CHECK-X64-NEXT: 16 | int a
  256. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  257. // CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
  258. // CHECK-X64-NEXT: 60 | (vtordisp for vbase D0)
  259. // CHECK-X64-NEXT: 64 | struct D0 (virtual base)
  260. // CHECK-X64-NEXT: 64 | (D0 vftable pointer)
  261. // CHECK-X64-NEXT: 72 | struct C1 (virtual base)
  262. // CHECK-X64-NEXT: 72 | int a
  263. // CHECK-X64-NEXT: | [sizeof=80, align=16
  264. // CHECK-X64-NEXT: | nvsize=16, nvalign=16]
  265. struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
  266. __declspec(align(32)) int a;
  267. I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  268. };
  269. // CHECK: *** Dumping AST Record Layout
  270. // CHECK-NEXT: 0 | struct I
  271. // CHECK-NEXT: 0 | (I vbtable pointer)
  272. // CHECK-NEXT: 32 | int a
  273. // CHECK-NEXT: 64 | struct B0 (virtual base) (empty)
  274. // CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
  275. // CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
  276. // CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
  277. // CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
  278. // CHECK-NEXT: | [sizeof=192, align=32
  279. // CHECK-NEXT: | nvsize=64, nvalign=32]
  280. // CHECK-X64: *** Dumping AST Record Layout
  281. // CHECK-X64-NEXT: 0 | struct I
  282. // CHECK-X64-NEXT: 0 | (I vbtable pointer)
  283. // CHECK-X64-NEXT: 32 | int a
  284. // CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)
  285. // CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
  286. // CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
  287. // CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
  288. // CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
  289. // CHECK-X64-NEXT: | [sizeof=192, align=32
  290. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  291. struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
  292. int a;
  293. J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  294. };
  295. // CHECK: *** Dumping AST Record Layout
  296. // CHECK-NEXT: 0 | struct J
  297. // CHECK-NEXT: 0 | (J vbtable pointer)
  298. // CHECK-NEXT: 4 | int a
  299. // CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
  300. // CHECK-NEXT: 40 | struct B1 (virtual base) (empty)
  301. // CHECK-NEXT: 72 | struct B2 (virtual base) (empty)
  302. // CHECK-NEXT: 104 | struct B3 (virtual base) (empty)
  303. // CHECK-NEXT: 136 | struct B4 (virtual base) (empty)
  304. // CHECK-NEXT: | [sizeof=160, align=32
  305. // CHECK-NEXT: | nvsize=8, nvalign=32]
  306. // CHECK-X64: *** Dumping AST Record Layout
  307. // CHECK-X64-NEXT: 0 | struct J
  308. // CHECK-X64-NEXT: 0 | (J vbtable pointer)
  309. // CHECK-X64-NEXT: 8 | int a
  310. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  311. // CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
  312. // CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)
  313. // CHECK-X64-NEXT: 104 | struct B3 (virtual base) (empty)
  314. // CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)
  315. // CHECK-X64-NEXT: | [sizeof=160, align=32
  316. // CHECK-X64-NEXT: | nvsize=16, nvalign=32]
  317. struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
  318. __declspec(align(32)) int a;
  319. K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  320. };
  321. // CHECK: *** Dumping AST Record Layout
  322. // CHECK: *** Dumping AST Record Layout
  323. // CHECK-NEXT: 0 | struct K
  324. // CHECK-NEXT: 0 | (K vbtable pointer)
  325. // CHECK-NEXT: 32 | int a
  326. // CHECK-NEXT: 64 | struct D1 (virtual base) (empty)
  327. // CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
  328. // CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
  329. // CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
  330. // CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
  331. // CHECK-NEXT: | [sizeof=192, align=32
  332. // CHECK-NEXT: | nvsize=64, nvalign=32]
  333. // CHECK-X64: *** Dumping AST Record Layout
  334. // CHECK-X64: *** Dumping AST Record Layout
  335. // CHECK-X64-NEXT: 0 | struct K
  336. // CHECK-X64-NEXT: 0 | (K vbtable pointer)
  337. // CHECK-X64-NEXT: 32 | int a
  338. // CHECK-X64-NEXT: 64 | struct D1 (virtual base) (empty)
  339. // CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
  340. // CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
  341. // CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
  342. // CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
  343. // CHECK-X64-NEXT: | [sizeof=192, align=32
  344. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  345. struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
  346. __declspec(align(32)) int a;
  347. L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  348. };
  349. // CHECK: *** Dumping AST Record Layout
  350. // CHECK-NEXT: 0 | struct L
  351. // CHECK-NEXT: 0 | (L vbtable pointer)
  352. // CHECK-NEXT: 32 | int a
  353. // CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
  354. // CHECK-NEXT: 68 | struct D1 (virtual base) (empty)
  355. // CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
  356. // CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
  357. // CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
  358. // CHECK-NEXT: | [sizeof=192, align=32
  359. // CHECK-NEXT: | nvsize=64, nvalign=32]
  360. // CHECK-X64: *** Dumping AST Record Layout
  361. // CHECK-X64-NEXT: 0 | struct L
  362. // CHECK-X64-NEXT: 0 | (L vbtable pointer)
  363. // CHECK-X64-NEXT: 32 | int a
  364. // CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
  365. // CHECK-X64-NEXT: 68 | struct D1 (virtual base) (empty)
  366. // CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
  367. // CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
  368. // CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
  369. // CHECK-X64-NEXT: | [sizeof=192, align=32
  370. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  371. struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
  372. __declspec(align(32)) int a;
  373. M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  374. };
  375. // CHECK: *** Dumping AST Record Layout
  376. // CHECK-NEXT: 0 | struct M
  377. // CHECK-NEXT: 0 | (M vbtable pointer)
  378. // CHECK-NEXT: 32 | int a
  379. // CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
  380. // CHECK-NEXT: 72 | struct B2 (virtual base) (empty)
  381. // CHECK-NEXT: 100 | struct D1 (virtual base) (empty)
  382. // CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
  383. // CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
  384. // CHECK-NEXT: | [sizeof=192, align=32
  385. // CHECK-NEXT: | nvsize=64, nvalign=32]
  386. // CHECK-X64: *** Dumping AST Record Layout
  387. // CHECK-X64-NEXT: 0 | struct M
  388. // CHECK-X64-NEXT: 0 | (M vbtable pointer)
  389. // CHECK-X64-NEXT: 32 | int a
  390. // CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
  391. // CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)
  392. // CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)
  393. // CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
  394. // CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
  395. // CHECK-X64-NEXT: | [sizeof=192, align=32
  396. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  397. struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
  398. __declspec(align(32)) int a;
  399. N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  400. };
  401. // CHECK: *** Dumping AST Record Layout
  402. // CHECK-NEXT: 0 | struct N
  403. // CHECK-NEXT: 0 | (N vbtable pointer)
  404. // CHECK-NEXT: 32 | int a
  405. // CHECK-NEXT: 64 | struct C0 (virtual base)
  406. // CHECK-NEXT: 64 | int a
  407. // CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
  408. // CHECK-NEXT: 100 | struct D1 (virtual base) (empty)
  409. // CHECK-NEXT: 136 | struct B2 (virtual base) (empty)
  410. // CHECK-NEXT: 168 | struct B3 (virtual base) (empty)
  411. // CHECK-NEXT: 200 | struct B4 (virtual base) (empty)
  412. // CHECK-NEXT: | [sizeof=224, align=32
  413. // CHECK-NEXT: | nvsize=64, nvalign=32]
  414. // CHECK-X64: *** Dumping AST Record Layout
  415. // CHECK-X64-NEXT: 0 | struct N
  416. // CHECK-X64-NEXT: 0 | (N vbtable pointer)
  417. // CHECK-X64-NEXT: 32 | int a
  418. // CHECK-X64-NEXT: 64 | struct C0 (virtual base)
  419. // CHECK-X64-NEXT: 64 | int a
  420. // CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
  421. // CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)
  422. // CHECK-X64-NEXT: 136 | struct B2 (virtual base) (empty)
  423. // CHECK-X64-NEXT: 168 | struct B3 (virtual base) (empty)
  424. // CHECK-X64-NEXT: 200 | struct B4 (virtual base) (empty)
  425. // CHECK-X64-NEXT: | [sizeof=224, align=32
  426. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  427. struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
  428. __declspec(align(32)) int a;
  429. O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  430. };
  431. // CHECK: *** Dumping AST Record Layout
  432. // CHECK-NEXT: 0 | struct O
  433. // CHECK-NEXT: 0 | (O vbtable pointer)
  434. // CHECK-NEXT: 32 | int a
  435. // CHECK-NEXT: 64 | struct C0 (virtual base)
  436. // CHECK-NEXT: 64 | int a
  437. // CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
  438. // CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
  439. // CHECK-NEXT: 132 | struct D1 (virtual base) (empty)
  440. // CHECK-NEXT: 168 | struct B3 (virtual base) (empty)
  441. // CHECK-NEXT: 200 | struct B4 (virtual base) (empty)
  442. // CHECK-NEXT: | [sizeof=224, align=32
  443. // CHECK-NEXT: | nvsize=64, nvalign=32]
  444. // CHECK-X64: *** Dumping AST Record Layout
  445. // CHECK-X64-NEXT: 0 | struct O
  446. // CHECK-X64-NEXT: 0 | (O vbtable pointer)
  447. // CHECK-X64-NEXT: 32 | int a
  448. // CHECK-X64-NEXT: 64 | struct C0 (virtual base)
  449. // CHECK-X64-NEXT: 64 | int a
  450. // CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
  451. // CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
  452. // CHECK-X64-NEXT: 132 | struct D1 (virtual base) (empty)
  453. // CHECK-X64-NEXT: 168 | struct B3 (virtual base) (empty)
  454. // CHECK-X64-NEXT: 200 | struct B4 (virtual base) (empty)
  455. // CHECK-X64-NEXT: | [sizeof=224, align=32
  456. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  457. struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
  458. __declspec(align(32)) int a;
  459. P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  460. };
  461. // CHECK: *** Dumping AST Record Layout
  462. // CHECK-NEXT: 0 | struct P
  463. // CHECK-NEXT: 0 | (P vbtable pointer)
  464. // CHECK-NEXT: 32 | int a
  465. // CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
  466. // CHECK-NEXT: 64 | struct C0 (virtual base)
  467. // CHECK-NEXT: 64 | int a
  468. // CHECK-NEXT: 68 | struct D1 (virtual base) (empty)
  469. // CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
  470. // CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
  471. // CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
  472. // CHECK-NEXT: | [sizeof=192, align=32
  473. // CHECK-NEXT: | nvsize=64, nvalign=32]
  474. // CHECK-X64: *** Dumping AST Record Layout
  475. // CHECK-X64-NEXT: 0 | struct P
  476. // CHECK-X64-NEXT: 0 | (P vbtable pointer)
  477. // CHECK-X64-NEXT: 32 | int a
  478. // CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
  479. // CHECK-X64-NEXT: 64 | struct C0 (virtual base)
  480. // CHECK-X64-NEXT: 64 | int a
  481. // CHECK-X64-NEXT: 68 | struct D1 (virtual base) (empty)
  482. // CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
  483. // CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
  484. // CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
  485. // CHECK-X64-NEXT: | [sizeof=192, align=32
  486. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  487. struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
  488. __declspec(align(32)) int a;
  489. Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  490. };
  491. // CHECK: *** Dumping AST Record Layout
  492. // CHECK-NEXT: 0 | struct Q
  493. // CHECK-NEXT: 0 | (Q vbtable pointer)
  494. // CHECK-NEXT: 32 | int a
  495. // CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
  496. // CHECK-NEXT: 64 | struct C0 (virtual base)
  497. // CHECK-NEXT: 64 | int a
  498. // CHECK-NEXT: 72 | struct B2 (virtual base) (empty)
  499. // CHECK-NEXT: 100 | struct D1 (virtual base) (empty)
  500. // CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
  501. // CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
  502. // CHECK-NEXT: | [sizeof=192, align=32
  503. // CHECK-NEXT: | nvsize=64, nvalign=32]
  504. // CHECK-X64: *** Dumping AST Record Layout
  505. // CHECK-X64-NEXT: 0 | struct Q
  506. // CHECK-X64-NEXT: 0 | (Q vbtable pointer)
  507. // CHECK-X64-NEXT: 32 | int a
  508. // CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
  509. // CHECK-X64-NEXT: 64 | struct C0 (virtual base)
  510. // CHECK-X64-NEXT: 64 | int a
  511. // CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)
  512. // CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)
  513. // CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
  514. // CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
  515. // CHECK-X64-NEXT: | [sizeof=192, align=32
  516. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  517. struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
  518. __declspec(align(32)) int a;
  519. R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  520. };
  521. // CHECK: *** Dumping AST Record Layout
  522. // CHECK-NEXT: 0 | struct R
  523. // CHECK-NEXT: 0 | (R vbtable pointer)
  524. // CHECK-NEXT: 32 | int a
  525. // CHECK-NEXT: 64 | struct B0 (virtual base) (empty)
  526. // CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
  527. // CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
  528. // CHECK-NEXT: 104 | struct C0 (virtual base)
  529. // CHECK-NEXT: 104 | int a
  530. // CHECK-NEXT: 112 | struct B3 (virtual base) (empty)
  531. // CHECK-NEXT: 136 | struct B4 (virtual base) (empty)
  532. // CHECK-NEXT: | [sizeof=160, align=32
  533. // CHECK-NEXT: | nvsize=64, nvalign=32]
  534. // CHECK-X64: *** Dumping AST Record Layout
  535. // CHECK-X64-NEXT: 0 | struct R
  536. // CHECK-X64-NEXT: 0 | (R vbtable pointer)
  537. // CHECK-X64-NEXT: 32 | int a
  538. // CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)
  539. // CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
  540. // CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
  541. // CHECK-X64-NEXT: 104 | struct C0 (virtual base)
  542. // CHECK-X64-NEXT: 104 | int a
  543. // CHECK-X64-NEXT: 112 | struct B3 (virtual base) (empty)
  544. // CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)
  545. // CHECK-X64-NEXT: | [sizeof=160, align=32
  546. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  547. struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
  548. __declspec(align(32)) int a;
  549. S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  550. };
  551. // CHECK: *** Dumping AST Record Layout
  552. // CHECK-NEXT: 0 | struct S
  553. // CHECK-NEXT: 0 | (S vbtable pointer)
  554. // CHECK-NEXT: 32 | int a
  555. // CHECK-NEXT: 64 | struct B0 (virtual base) (empty)
  556. // CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
  557. // CHECK-NEXT: 72 | struct C0 (virtual base)
  558. // CHECK-NEXT: 72 | int a
  559. // CHECK-NEXT: 80 | struct B2 (virtual base) (empty)
  560. // CHECK-NEXT: 104 | struct B3 (virtual base) (empty)
  561. // CHECK-NEXT: 136 | struct B4 (virtual base) (empty)
  562. // CHECK-NEXT: | [sizeof=160, align=32
  563. // CHECK-NEXT: | nvsize=64, nvalign=32]
  564. // CHECK-X64: *** Dumping AST Record Layout
  565. // CHECK-X64-NEXT: 0 | struct S
  566. // CHECK-X64-NEXT: 0 | (S vbtable pointer)
  567. // CHECK-X64-NEXT: 32 | int a
  568. // CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)
  569. // CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
  570. // CHECK-X64-NEXT: 72 | struct C0 (virtual base)
  571. // CHECK-X64-NEXT: 72 | int a
  572. // CHECK-X64-NEXT: 80 | struct B2 (virtual base) (empty)
  573. // CHECK-X64-NEXT: 104 | struct B3 (virtual base) (empty)
  574. // CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)
  575. // CHECK-X64-NEXT: | [sizeof=160, align=32
  576. // CHECK-X64-NEXT: | nvsize=64, nvalign=32]
  577. struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
  578. __declspec(align(16)) int a;
  579. T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  580. };
  581. // CHECK: *** Dumping AST Record Layout
  582. // CHECK: *** Dumping AST Record Layout
  583. // CHECK-NEXT: 0 | struct T
  584. // CHECK-NEXT: 0 | (T vbtable pointer)
  585. // CHECK-NEXT: 16 | int a
  586. // CHECK-NEXT: 32 | struct B0 (virtual base) (empty)
  587. // CHECK-NEXT: 40 | struct B1 (virtual base) (empty)
  588. // CHECK-NEXT: 40 | struct C0 (virtual base)
  589. // CHECK-NEXT: 40 | int a
  590. // CHECK-NEXT: 44 | struct D2 (virtual base)
  591. // CHECK-NEXT: 44 | int [8] a
  592. // CHECK-NEXT: 80 | struct B2 (virtual base) (empty)
  593. // CHECK-NEXT: 88 | struct B3 (virtual base) (empty)
  594. // CHECK-NEXT: 104 | struct B4 (virtual base) (empty)
  595. // CHECK-NEXT: | [sizeof=112, align=16
  596. // CHECK-NEXT: | nvsize=32, nvalign=16]
  597. // CHECK-X64: *** Dumping AST Record Layout
  598. // CHECK-X64: *** Dumping AST Record Layout
  599. // CHECK-X64-NEXT: 0 | struct T
  600. // CHECK-X64-NEXT: 0 | (T vbtable pointer)
  601. // CHECK-X64-NEXT: 16 | int a
  602. // CHECK-X64-NEXT: 32 | struct B0 (virtual base) (empty)
  603. // CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
  604. // CHECK-X64-NEXT: 40 | struct C0 (virtual base)
  605. // CHECK-X64-NEXT: 40 | int a
  606. // CHECK-X64-NEXT: 44 | struct D2 (virtual base)
  607. // CHECK-X64-NEXT: 44 | int [8] a
  608. // CHECK-X64-NEXT: 80 | struct B2 (virtual base) (empty)
  609. // CHECK-X64-NEXT: 88 | struct B3 (virtual base) (empty)
  610. // CHECK-X64-NEXT: 104 | struct B4 (virtual base) (empty)
  611. // CHECK-X64-NEXT: | [sizeof=112, align=16
  612. // CHECK-X64-NEXT: | nvsize=32, nvalign=16]
  613. struct __declspec(align(32)) U : virtual B0, virtual B1 {
  614. int a;
  615. U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  616. };
  617. // CHECK: *** Dumping AST Record Layout
  618. // CHECK-NEXT: 0 | struct U
  619. // CHECK-NEXT: 0 | (U vbtable pointer)
  620. // CHECK-NEXT: 4 | int a
  621. // CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
  622. // CHECK-NEXT: 40 | struct B1 (virtual base) (empty)
  623. // CHECK-NEXT: | [sizeof=64, align=32
  624. // CHECK-NEXT: | nvsize=8, nvalign=32]
  625. // CHECK-X64: *** Dumping AST Record Layout
  626. // CHECK-X64-NEXT: 0 | struct U
  627. // CHECK-X64-NEXT: 0 | (U vbtable pointer)
  628. // CHECK-X64-NEXT: 8 | int a
  629. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  630. // CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
  631. // CHECK-X64-NEXT: | [sizeof=64, align=32
  632. // CHECK-X64-NEXT: | nvsize=16, nvalign=32]
  633. struct __declspec(align(32)) V : virtual D1 {
  634. int a;
  635. V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
  636. };
  637. // CHECK: *** Dumping AST Record Layout
  638. // CHECK-NEXT: 0 | struct V
  639. // CHECK-NEXT: 0 | (V vbtable pointer)
  640. // CHECK-NEXT: 4 | int a
  641. // CHECK-NEXT: 8 | struct D1 (virtual base) (empty)
  642. // CHECK-NEXT: | [sizeof=32, align=32
  643. // CHECK-NEXT: | nvsize=8, nvalign=32]
  644. // CHECK-X64: *** Dumping AST Record Layout
  645. // CHECK-X64-NEXT: 0 | struct V
  646. // CHECK-X64-NEXT: 0 | (V vbtable pointer)
  647. // CHECK-X64-NEXT: 8 | int a
  648. // CHECK-X64-NEXT: 16 | struct D1 (virtual base) (empty)
  649. // CHECK-X64-NEXT: | [sizeof=32, align=32
  650. // CHECK-X64-NEXT: | nvsize=16, nvalign=32]
  651. struct T0 {};
  652. struct T1 : T0 { char a; };
  653. struct T3 : virtual T1, virtual T0 { long long a; };
  654. // CHECK: *** Dumping AST Record Layout
  655. // CHECK: *** Dumping AST Record Layout
  656. // CHECK: *** Dumping AST Record Layout
  657. // CHECK-NEXT: 0 | struct T3
  658. // CHECK-NEXT: 0 | (T3 vbtable pointer)
  659. // CHECK-NEXT: 8 | long long a
  660. // CHECK-NEXT: 16 | struct T1 (virtual base)
  661. // CHECK-NEXT: 16 | struct T0 (base) (empty)
  662. // CHECK-NEXT: 16 | char a
  663. // CHECK-NEXT: 24 | struct T0 (virtual base) (empty)
  664. // CHECK-NEXT: | [sizeof=24, align=8
  665. // CHECK-NEXT: | nvsize=16, nvalign=8]
  666. // CHECK-X64: *** Dumping AST Record Layout
  667. // CHECK-X64: *** Dumping AST Record Layout
  668. // CHECK-X64: *** Dumping AST Record Layout
  669. // CHECK-X64-NEXT: 0 | struct T3
  670. // CHECK-X64-NEXT: 0 | (T3 vbtable pointer)
  671. // CHECK-X64-NEXT: 8 | long long a
  672. // CHECK-X64-NEXT: 16 | struct T1 (virtual base)
  673. // CHECK-X64-NEXT: 16 | struct T0 (base) (empty)
  674. // CHECK-X64-NEXT: 16 | char a
  675. // CHECK-X64-NEXT: 24 | struct T0 (virtual base) (empty)
  676. // CHECK-X64-NEXT: | [sizeof=24, align=8
  677. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  678. struct Q0A {};
  679. struct Q0B { char Q0BField; };
  680. struct Q0C : virtual Q0A, virtual Q0B { char Q0CField; };
  681. struct Q0D : Q0C, Q0A {};
  682. // CHECK: *** Dumping AST Record Layout
  683. // CHECK: *** Dumping AST Record Layout
  684. // CHECK: *** Dumping AST Record Layout
  685. // CHECK: *** Dumping AST Record Layout
  686. // CHECK-NEXT: 0 | struct Q0D
  687. // CHECK-NEXT: 0 | struct Q0C (base)
  688. // CHECK-NEXT: 0 | (Q0C vbtable pointer)
  689. // CHECK-NEXT: 4 | char Q0CField
  690. // CHECK-NEXT: 8 | struct Q0A (base) (empty)
  691. // CHECK-NEXT: 8 | struct Q0A (virtual base) (empty)
  692. // CHECK-NEXT: 8 | struct Q0B (virtual base)
  693. // CHECK-NEXT: 8 | char Q0BField
  694. // CHECK-NEXT: | [sizeof=9, align=4
  695. // CHECK-NEXT: | nvsize=8, nvalign=4]
  696. // CHECK-X64: *** Dumping AST Record Layout
  697. // CHECK-X64: *** Dumping AST Record Layout
  698. // CHECK-X64: *** Dumping AST Record Layout
  699. // CHECK-X64: *** Dumping AST Record Layout
  700. // CHECK-X64-NEXT: 0 | struct Q0D
  701. // CHECK-X64-NEXT: 0 | struct Q0C (base)
  702. // CHECK-X64-NEXT: 0 | (Q0C vbtable pointer)
  703. // CHECK-X64-NEXT: 8 | char Q0CField
  704. // CHECK-X64-NEXT: 16 | struct Q0A (base) (empty)
  705. // CHECK-X64-NEXT: 16 | struct Q0A (virtual base) (empty)
  706. // CHECK-X64-NEXT: 16 | struct Q0B (virtual base)
  707. // CHECK-X64-NEXT: 16 | char Q0BField
  708. // CHECK-X64-NEXT: | [sizeof=24, align=8
  709. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  710. int a[
  711. sizeof(A)+
  712. sizeof(B)+
  713. sizeof(C)+
  714. sizeof(D)+
  715. sizeof(E)+
  716. sizeof(F)+
  717. sizeof(G)+
  718. sizeof(H)+
  719. sizeof(I)+
  720. sizeof(J)+
  721. sizeof(K)+
  722. sizeof(L)+
  723. sizeof(M)+
  724. sizeof(N)+
  725. sizeof(O)+
  726. sizeof(P)+
  727. sizeof(Q)+
  728. sizeof(R)+
  729. sizeof(S)+
  730. sizeof(T)+
  731. sizeof(U)+
  732. sizeof(V)+
  733. sizeof(T3)+
  734. sizeof(Q0D)];