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

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