ms-x86-lazy-empty-nonvirtual-base.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  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 B0 { B0() { printf("B0 = %p\n", this); } };
  7. struct B1 { B1() { printf("B1 = %p\n", this); } };
  8. struct B2 { B2() { printf("B2 = %p\n", this); } };
  9. struct B3 { B3() { printf("B3 = %p\n", this); } };
  10. struct B4 { B4() { printf("B4 = %p\n", this); } };
  11. struct B5 { B5() { printf("B5 = %p\n", this); } };
  12. struct __declspec(align(2)) B6 { B6() { printf("B6 = %p\n", this); } };
  13. struct __declspec(align(16)) B7 { B7() { printf("B7 = %p\n", this); } };
  14. struct B8 { char c[5]; B8() { printf("B8 = %p\n", this); } };
  15. struct B9 { char c[6]; B9() { printf("B9 = %p\n", this); } };
  16. struct B10 { char c[7]; B10() { printf("B10 = %p\n", this); } };
  17. struct B11 { char c[8]; B11() { printf("B11 = %p\n", this); } };
  18. struct B0X { B0X() { printf("B0 = %p\n", this); } };
  19. struct B1X { B1X() { printf("B1 = %p\n", this); } };
  20. struct __declspec(align(16)) B2X { B2X() { printf("B2 = %p\n", this); } };
  21. struct __declspec(align(2)) B3X { B3X() { printf("B3 = %p\n", this); } };
  22. struct B4X { B4X() { printf("B4 = %p\n", this); } };
  23. struct B5X { B5X() { printf("B5 = %p\n", this); } };
  24. struct B6X { B6X() { printf("B6 = %p\n", this); } };
  25. struct B8X { short a; B8X() : a(0x000000B8) { printf("B8 = %p\n", this); } };
  26. struct AA : B8, B1, virtual B0 {
  27. int a;
  28. AA() : a(0x000000AA) { printf("AA = %p\n", this); }
  29. };
  30. // CHECK: *** Dumping AST Record Layout
  31. // CHECK: *** Dumping AST Record Layout
  32. // CHECK: *** Dumping AST Record Layout
  33. // CHECK: *** Dumping AST Record Layout
  34. // CHECK-NEXT: 0 | struct AA
  35. // CHECK-NEXT: 0 | struct B8 (base)
  36. // CHECK-NEXT: 0 | char [5] c
  37. // CHECK-NEXT: 13 | struct B1 (base) (empty)
  38. // CHECK-NEXT: 8 | (AA vbtable pointer)
  39. // CHECK-NEXT: 16 | int a
  40. // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
  41. // CHECK-NEXT: | [sizeof=20, align=4
  42. // CHECK-NEXT: | nvsize=20, nvalign=4]
  43. // CHECK-X64: *** Dumping AST Record Layout
  44. // CHECK-X64: *** Dumping AST Record Layout
  45. // CHECK-X64: *** Dumping AST Record Layout
  46. // CHECK-X64: *** Dumping AST Record Layout
  47. // CHECK-X64-NEXT: 0 | struct AA
  48. // CHECK-X64-NEXT: 0 | struct B8 (base)
  49. // CHECK-X64-NEXT: 0 | char [5] c
  50. // CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
  51. // CHECK-X64-NEXT: 8 | (AA vbtable pointer)
  52. // CHECK-X64-NEXT: 20 | int a
  53. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  54. // CHECK-X64-NEXT: | [sizeof=24, align=8
  55. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  56. struct AB : B8, B1, virtual B0 {
  57. short a;
  58. AB() : a(0x000000AB) { printf("AB = %p\n", this); }
  59. };
  60. // CHECK: *** Dumping AST Record Layout
  61. // CHECK-NEXT: 0 | struct AB
  62. // CHECK-NEXT: 0 | struct B8 (base)
  63. // CHECK-NEXT: 0 | char [5] c
  64. // CHECK-NEXT: 13 | struct B1 (base) (empty)
  65. // CHECK-NEXT: 8 | (AB vbtable pointer)
  66. // CHECK-NEXT: 14 | short a
  67. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  68. // CHECK-NEXT: | [sizeof=16, align=4
  69. // CHECK-NEXT: | nvsize=16, nvalign=4]
  70. // CHECK-X64: *** Dumping AST Record Layout
  71. // CHECK-X64-NEXT: 0 | struct AB
  72. // CHECK-X64-NEXT: 0 | struct B8 (base)
  73. // CHECK-X64-NEXT: 0 | char [5] c
  74. // CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
  75. // CHECK-X64-NEXT: 8 | (AB vbtable pointer)
  76. // CHECK-X64-NEXT: 18 | short a
  77. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  78. // CHECK-X64-NEXT: | [sizeof=24, align=8
  79. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  80. struct AC : B8, B1, virtual B0 {
  81. char a;
  82. AC() : a(0x000000AC) { printf("AC = %p\n", this); }
  83. };
  84. // CHECK: *** Dumping AST Record Layout
  85. // CHECK-NEXT: 0 | struct AC
  86. // CHECK-NEXT: 0 | struct B8 (base)
  87. // CHECK-NEXT: 0 | char [5] c
  88. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  89. // CHECK-NEXT: 8 | (AC vbtable pointer)
  90. // CHECK-NEXT: 12 | char a
  91. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  92. // CHECK-NEXT: | [sizeof=16, align=4
  93. // CHECK-NEXT: | nvsize=16, nvalign=4]
  94. // CHECK-X64: *** Dumping AST Record Layout
  95. // CHECK-X64-NEXT: 0 | struct AC
  96. // CHECK-X64-NEXT: 0 | struct B8 (base)
  97. // CHECK-X64-NEXT: 0 | char [5] c
  98. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  99. // CHECK-X64-NEXT: 8 | (AC vbtable pointer)
  100. // CHECK-X64-NEXT: 16 | char a
  101. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  102. // CHECK-X64-NEXT: | [sizeof=24, align=8
  103. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  104. struct AD : B8, B1, virtual B0 {
  105. AD() { printf("AD = %p\n", this); }
  106. };
  107. // CHECK: *** Dumping AST Record Layout
  108. // CHECK-NEXT: 0 | struct AD
  109. // CHECK-NEXT: 0 | struct B8 (base)
  110. // CHECK-NEXT: 0 | char [5] c
  111. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  112. // CHECK-NEXT: 8 | (AD vbtable pointer)
  113. // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
  114. // CHECK-NEXT: | [sizeof=12, align=4
  115. // CHECK-NEXT: | nvsize=12, nvalign=4]
  116. // CHECK-X64: *** Dumping AST Record Layout
  117. // CHECK-X64-NEXT: 0 | struct AD
  118. // CHECK-X64-NEXT: 0 | struct B8 (base)
  119. // CHECK-X64-NEXT: 0 | char [5] c
  120. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  121. // CHECK-X64-NEXT: 8 | (AD vbtable pointer)
  122. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  123. // CHECK-X64-NEXT: | [sizeof=16, align=8
  124. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  125. struct AA1 : B9, B1, virtual B0 {
  126. int a;
  127. AA1() : a(0x00000AA1) { printf("AA1 = %p\n", this); }
  128. };
  129. // CHECK: *** Dumping AST Record Layout
  130. // CHECK: *** Dumping AST Record Layout
  131. // CHECK-NEXT: 0 | struct AA1
  132. // CHECK-NEXT: 0 | struct B9 (base)
  133. // CHECK-NEXT: 0 | char [6] c
  134. // CHECK-NEXT: 14 | struct B1 (base) (empty)
  135. // CHECK-NEXT: 8 | (AA1 vbtable pointer)
  136. // CHECK-NEXT: 16 | int a
  137. // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
  138. // CHECK-NEXT: | [sizeof=20, align=4
  139. // CHECK-NEXT: | nvsize=20, nvalign=4]
  140. // CHECK-X64: *** Dumping AST Record Layout
  141. // CHECK-X64: *** Dumping AST Record Layout
  142. // CHECK-X64-NEXT: 0 | struct AA1
  143. // CHECK-X64-NEXT: 0 | struct B9 (base)
  144. // CHECK-X64-NEXT: 0 | char [6] c
  145. // CHECK-X64-NEXT: 18 | struct B1 (base) (empty)
  146. // CHECK-X64-NEXT: 8 | (AA1 vbtable pointer)
  147. // CHECK-X64-NEXT: 20 | int a
  148. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  149. // CHECK-X64-NEXT: | [sizeof=24, align=8
  150. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  151. struct AB1 : B9, B1, virtual B0 {
  152. short a;
  153. AB1() : a(0x00000AB1) { printf("AB1 = %p\n", this); }
  154. };
  155. // CHECK: *** Dumping AST Record Layout
  156. // CHECK-NEXT: 0 | struct AB1
  157. // CHECK-NEXT: 0 | struct B9 (base)
  158. // CHECK-NEXT: 0 | char [6] c
  159. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  160. // CHECK-NEXT: 8 | (AB1 vbtable pointer)
  161. // CHECK-NEXT: 12 | short a
  162. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  163. // CHECK-NEXT: | [sizeof=16, align=4
  164. // CHECK-NEXT: | nvsize=16, nvalign=4]
  165. // CHECK-X64: *** Dumping AST Record Layout
  166. // CHECK-X64-NEXT: 0 | struct AB1
  167. // CHECK-X64-NEXT: 0 | struct B9 (base)
  168. // CHECK-X64-NEXT: 0 | char [6] c
  169. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  170. // CHECK-X64-NEXT: 8 | (AB1 vbtable pointer)
  171. // CHECK-X64-NEXT: 16 | short a
  172. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  173. // CHECK-X64-NEXT: | [sizeof=24, align=8
  174. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  175. struct AC1 : B9, B1, virtual B0 {
  176. char a;
  177. AC1() : a(0x000000C1) { printf("AC1 = %p\n", this); }
  178. };
  179. // CHECK: *** Dumping AST Record Layout
  180. // CHECK-NEXT: 0 | struct AC1
  181. // CHECK-NEXT: 0 | struct B9 (base)
  182. // CHECK-NEXT: 0 | char [6] c
  183. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  184. // CHECK-NEXT: 8 | (AC1 vbtable pointer)
  185. // CHECK-NEXT: 12 | char a
  186. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  187. // CHECK-NEXT: | [sizeof=16, align=4
  188. // CHECK-NEXT: | nvsize=16, nvalign=4]
  189. // CHECK-X64: *** Dumping AST Record Layout
  190. // CHECK-X64-NEXT: 0 | struct AC1
  191. // CHECK-X64-NEXT: 0 | struct B9 (base)
  192. // CHECK-X64-NEXT: 0 | char [6] c
  193. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  194. // CHECK-X64-NEXT: 8 | (AC1 vbtable pointer)
  195. // CHECK-X64-NEXT: 16 | char a
  196. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  197. // CHECK-X64-NEXT: | [sizeof=24, align=8
  198. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  199. struct AD1 : B9, B1, virtual B0 {
  200. AD1() { printf("AD1 = %p\n", this); }
  201. };
  202. // CHECK: *** Dumping AST Record Layout
  203. // CHECK-NEXT: 0 | struct AD1
  204. // CHECK-NEXT: 0 | struct B9 (base)
  205. // CHECK-NEXT: 0 | char [6] c
  206. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  207. // CHECK-NEXT: 8 | (AD1 vbtable pointer)
  208. // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
  209. // CHECK-NEXT: | [sizeof=12, align=4
  210. // CHECK-NEXT: | nvsize=12, nvalign=4]
  211. // CHECK-X64: *** Dumping AST Record Layout
  212. // CHECK-X64-NEXT: 0 | struct AD1
  213. // CHECK-X64-NEXT: 0 | struct B9 (base)
  214. // CHECK-X64-NEXT: 0 | char [6] c
  215. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  216. // CHECK-X64-NEXT: 8 | (AD1 vbtable pointer)
  217. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  218. // CHECK-X64-NEXT: | [sizeof=16, align=8
  219. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  220. struct AA2 : B10, B1, virtual B0 {
  221. int a;
  222. AA2() : a(0x00000AA2) { printf("AA2 = %p\n", this); }
  223. };
  224. // CHECK: *** Dumping AST Record Layout
  225. // CHECK: *** Dumping AST Record Layout
  226. // CHECK-NEXT: 0 | struct AA2
  227. // CHECK-NEXT: 0 | struct B10 (base)
  228. // CHECK-NEXT: 0 | char [7] c
  229. // CHECK-NEXT: 15 | struct B1 (base) (empty)
  230. // CHECK-NEXT: 8 | (AA2 vbtable pointer)
  231. // CHECK-NEXT: 16 | int a
  232. // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
  233. // CHECK-NEXT: | [sizeof=20, align=4
  234. // CHECK-NEXT: | nvsize=20, nvalign=4]
  235. // CHECK-X64: *** Dumping AST Record Layout
  236. // CHECK-X64: *** Dumping AST Record Layout
  237. // CHECK-X64-NEXT: 0 | struct AA2
  238. // CHECK-X64-NEXT: 0 | struct B10 (base)
  239. // CHECK-X64-NEXT: 0 | char [7] c
  240. // CHECK-X64-NEXT: 19 | struct B1 (base) (empty)
  241. // CHECK-X64-NEXT: 8 | (AA2 vbtable pointer)
  242. // CHECK-X64-NEXT: 20 | int a
  243. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  244. // CHECK-X64-NEXT: | [sizeof=24, align=8
  245. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  246. struct AB2 : B10, B1, virtual B0 {
  247. short a;
  248. AB2() : a(0x00000AB2) { printf("AB2 = %p\n", this); }
  249. };
  250. // CHECK: *** Dumping AST Record Layout
  251. // CHECK-NEXT: 0 | struct AB2
  252. // CHECK-NEXT: 0 | struct B10 (base)
  253. // CHECK-NEXT: 0 | char [7] c
  254. // CHECK-NEXT: 13 | struct B1 (base) (empty)
  255. // CHECK-NEXT: 8 | (AB2 vbtable pointer)
  256. // CHECK-NEXT: 14 | short a
  257. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  258. // CHECK-NEXT: | [sizeof=16, align=4
  259. // CHECK-NEXT: | nvsize=16, nvalign=4]
  260. // CHECK-X64: *** Dumping AST Record Layout
  261. // CHECK-X64-NEXT: 0 | struct AB2
  262. // CHECK-X64-NEXT: 0 | struct B10 (base)
  263. // CHECK-X64-NEXT: 0 | char [7] c
  264. // CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
  265. // CHECK-X64-NEXT: 8 | (AB2 vbtable pointer)
  266. // CHECK-X64-NEXT: 18 | short a
  267. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  268. // CHECK-X64-NEXT: | [sizeof=24, align=8
  269. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  270. struct AC2 : B10, B1, virtual B0 {
  271. char a;
  272. AC2() : a(0x000000C2) { printf("AC2 = %p\n", this); }
  273. };
  274. // CHECK: *** Dumping AST Record Layout
  275. // CHECK-NEXT: 0 | struct AC2
  276. // CHECK-NEXT: 0 | struct B10 (base)
  277. // CHECK-NEXT: 0 | char [7] c
  278. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  279. // CHECK-NEXT: 8 | (AC2 vbtable pointer)
  280. // CHECK-NEXT: 12 | char a
  281. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  282. // CHECK-NEXT: | [sizeof=16, align=4
  283. // CHECK-NEXT: | nvsize=16, nvalign=4]
  284. // CHECK-X64: *** Dumping AST Record Layout
  285. // CHECK-X64-NEXT: 0 | struct AC2
  286. // CHECK-X64-NEXT: 0 | struct B10 (base)
  287. // CHECK-X64-NEXT: 0 | char [7] c
  288. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  289. // CHECK-X64-NEXT: 8 | (AC2 vbtable pointer)
  290. // CHECK-X64-NEXT: 16 | char a
  291. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  292. // CHECK-X64-NEXT: | [sizeof=24, align=8
  293. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  294. struct AD2 : B10, B1, virtual B0 {
  295. AD2() { printf("AD2 = %p\n", this); }
  296. };
  297. // CHECK: *** Dumping AST Record Layout
  298. // CHECK-NEXT: 0 | struct AD2
  299. // CHECK-NEXT: 0 | struct B10 (base)
  300. // CHECK-NEXT: 0 | char [7] c
  301. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  302. // CHECK-NEXT: 8 | (AD2 vbtable pointer)
  303. // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
  304. // CHECK-NEXT: | [sizeof=12, align=4
  305. // CHECK-NEXT: | nvsize=12, nvalign=4]
  306. // CHECK-X64: *** Dumping AST Record Layout
  307. // CHECK-X64-NEXT: 0 | struct AD2
  308. // CHECK-X64-NEXT: 0 | struct B10 (base)
  309. // CHECK-X64-NEXT: 0 | char [7] c
  310. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  311. // CHECK-X64-NEXT: 8 | (AD2 vbtable pointer)
  312. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  313. // CHECK-X64-NEXT: | [sizeof=16, align=8
  314. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  315. struct AA3 : B11, B1, virtual B0 {
  316. int a;
  317. AA3() : a(0x00000AA3) { printf("AA3 = %p\n", this); }
  318. };
  319. // CHECK: *** Dumping AST Record Layout
  320. // CHECK: *** Dumping AST Record Layout
  321. // CHECK-NEXT: 0 | struct AA3
  322. // CHECK-NEXT: 0 | struct B11 (base)
  323. // CHECK-NEXT: 0 | char [8] c
  324. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  325. // CHECK-NEXT: 8 | (AA3 vbtable pointer)
  326. // CHECK-NEXT: 12 | int a
  327. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  328. // CHECK-NEXT: | [sizeof=16, align=4
  329. // CHECK-NEXT: | nvsize=16, nvalign=4]
  330. // CHECK-X64: *** Dumping AST Record Layout
  331. // CHECK-X64: *** Dumping AST Record Layout
  332. // CHECK-X64-NEXT: 0 | struct AA3
  333. // CHECK-X64-NEXT: 0 | struct B11 (base)
  334. // CHECK-X64-NEXT: 0 | char [8] c
  335. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  336. // CHECK-X64-NEXT: 8 | (AA3 vbtable pointer)
  337. // CHECK-X64-NEXT: 16 | int a
  338. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  339. // CHECK-X64-NEXT: | [sizeof=24, align=8
  340. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  341. struct AB3 : B11, B1, virtual B0 {
  342. short a;
  343. AB3() : a(0x00000AB3) { printf("AB3 = %p\n", this); }
  344. };
  345. // CHECK: *** Dumping AST Record Layout
  346. // CHECK-NEXT: 0 | struct AB3
  347. // CHECK-NEXT: 0 | struct B11 (base)
  348. // CHECK-NEXT: 0 | char [8] c
  349. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  350. // CHECK-NEXT: 8 | (AB3 vbtable pointer)
  351. // CHECK-NEXT: 12 | short a
  352. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  353. // CHECK-NEXT: | [sizeof=16, align=4
  354. // CHECK-NEXT: | nvsize=16, nvalign=4]
  355. // CHECK-X64: *** Dumping AST Record Layout
  356. // CHECK-X64-NEXT: 0 | struct AB3
  357. // CHECK-X64-NEXT: 0 | struct B11 (base)
  358. // CHECK-X64-NEXT: 0 | char [8] c
  359. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  360. // CHECK-X64-NEXT: 8 | (AB3 vbtable pointer)
  361. // CHECK-X64-NEXT: 16 | short a
  362. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  363. // CHECK-X64-NEXT: | [sizeof=24, align=8
  364. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  365. struct AC3 : B11, B1, virtual B0 {
  366. char a;
  367. AC3() : a(0x000000C3) { printf("AC3 = %p\n", this); }
  368. };
  369. // CHECK: *** Dumping AST Record Layout
  370. // CHECK-NEXT: 0 | struct AC3
  371. // CHECK-NEXT: 0 | struct B11 (base)
  372. // CHECK-NEXT: 0 | char [8] c
  373. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  374. // CHECK-NEXT: 8 | (AC3 vbtable pointer)
  375. // CHECK-NEXT: 12 | char a
  376. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  377. // CHECK-NEXT: | [sizeof=16, align=4
  378. // CHECK-NEXT: | nvsize=16, nvalign=4]
  379. // CHECK-X64: *** Dumping AST Record Layout
  380. // CHECK-X64-NEXT: 0 | struct AC3
  381. // CHECK-X64-NEXT: 0 | struct B11 (base)
  382. // CHECK-X64-NEXT: 0 | char [8] c
  383. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  384. // CHECK-X64-NEXT: 8 | (AC3 vbtable pointer)
  385. // CHECK-X64-NEXT: 16 | char a
  386. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  387. // CHECK-X64-NEXT: | [sizeof=24, align=8
  388. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  389. struct AD3 : B11, B1, virtual B0 {
  390. AD3() { printf("AD3 = %p\n", this); }
  391. };
  392. // CHECK: *** Dumping AST Record Layout
  393. // CHECK-NEXT: 0 | struct AD3
  394. // CHECK-NEXT: 0 | struct B11 (base)
  395. // CHECK-NEXT: 0 | char [8] c
  396. // CHECK-NEXT: 12 | struct B1 (base) (empty)
  397. // CHECK-NEXT: 8 | (AD3 vbtable pointer)
  398. // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
  399. // CHECK-NEXT: | [sizeof=12, align=4
  400. // CHECK-NEXT: | nvsize=12, nvalign=4]
  401. // CHECK-X64: *** Dumping AST Record Layout
  402. // CHECK-X64-NEXT: 0 | struct AD3
  403. // CHECK-X64-NEXT: 0 | struct B11 (base)
  404. // CHECK-X64-NEXT: 0 | char [8] c
  405. // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
  406. // CHECK-X64-NEXT: 8 | (AD3 vbtable pointer)
  407. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  408. // CHECK-X64-NEXT: | [sizeof=16, align=8
  409. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  410. struct B : B1, B2, virtual B0 {
  411. B() { printf("B = %p\n", this); }
  412. };
  413. // CHECK: *** Dumping AST Record Layout
  414. // CHECK: *** Dumping AST Record Layout
  415. // CHECK-NEXT: 0 | struct B
  416. // CHECK-NEXT: 0 | struct B1 (base) (empty)
  417. // CHECK-NEXT: 8 | struct B2 (base) (empty)
  418. // CHECK-NEXT: 4 | (B vbtable pointer)
  419. // CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
  420. // CHECK-NEXT: | [sizeof=8, align=4
  421. // CHECK-NEXT: | nvsize=8, nvalign=4]
  422. // CHECK-X64: *** Dumping AST Record Layout
  423. // CHECK-X64: *** Dumping AST Record Layout
  424. // CHECK-X64-NEXT: 0 | struct B
  425. // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
  426. // CHECK-X64-NEXT: 16 | struct B2 (base) (empty)
  427. // CHECK-X64-NEXT: 8 | (B vbtable pointer)
  428. // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
  429. // CHECK-X64-NEXT: | [sizeof=16, align=8
  430. // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
  431. struct C : B1, B2, B3, virtual B0 {
  432. char a;
  433. C() : a(0x0000000C) { printf("C = %p\n", this); }
  434. };
  435. // CHECK: *** Dumping AST Record Layout
  436. // CHECK: *** Dumping AST Record Layout
  437. // CHECK-NEXT: 0 | struct C
  438. // CHECK-NEXT: 0 | struct B1 (base) (empty)
  439. // CHECK-NEXT: 1 | struct B2 (base) (empty)
  440. // CHECK-NEXT: 8 | struct B3 (base) (empty)
  441. // CHECK-NEXT: 4 | (C vbtable pointer)
  442. // CHECK-NEXT: 8 | char a
  443. // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
  444. // CHECK-NEXT: | [sizeof=12, align=4
  445. // CHECK-NEXT: | nvsize=12, nvalign=4]
  446. // CHECK-X64: *** Dumping AST Record Layout
  447. // CHECK-X64: *** Dumping AST Record Layout
  448. // CHECK-X64-NEXT: 0 | struct C
  449. // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
  450. // CHECK-X64-NEXT: 1 | struct B2 (base) (empty)
  451. // CHECK-X64-NEXT: 16 | struct B3 (base) (empty)
  452. // CHECK-X64-NEXT: 8 | (C vbtable pointer)
  453. // CHECK-X64-NEXT: 16 | char a
  454. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  455. // CHECK-X64-NEXT: | [sizeof=24, align=8
  456. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  457. struct D : B1, B2, B3, B4, B5, virtual B0 {
  458. int a;
  459. D() : a(0x0000000D) { printf("D = %p\n", this); }
  460. };
  461. // CHECK: *** Dumping AST Record Layout
  462. // CHECK: *** Dumping AST Record Layout
  463. // CHECK: *** Dumping AST Record Layout
  464. // CHECK-NEXT: 0 | struct D
  465. // CHECK-NEXT: 0 | struct B1 (base) (empty)
  466. // CHECK-NEXT: 1 | struct B2 (base) (empty)
  467. // CHECK-NEXT: 2 | struct B3 (base) (empty)
  468. // CHECK-NEXT: 3 | struct B4 (base) (empty)
  469. // CHECK-NEXT: 8 | struct B5 (base) (empty)
  470. // CHECK-NEXT: 4 | (D vbtable pointer)
  471. // CHECK-NEXT: 8 | int a
  472. // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
  473. // CHECK-NEXT: | [sizeof=12, align=4
  474. // CHECK-NEXT: | nvsize=12, nvalign=4]
  475. // CHECK-X64: *** Dumping AST Record Layout
  476. // CHECK-X64: *** Dumping AST Record Layout
  477. // CHECK-X64: *** Dumping AST Record Layout
  478. // CHECK-X64-NEXT: 0 | struct D
  479. // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
  480. // CHECK-X64-NEXT: 1 | struct B2 (base) (empty)
  481. // CHECK-X64-NEXT: 2 | struct B3 (base) (empty)
  482. // CHECK-X64-NEXT: 3 | struct B4 (base) (empty)
  483. // CHECK-X64-NEXT: 16 | struct B5 (base) (empty)
  484. // CHECK-X64-NEXT: 8 | (D vbtable pointer)
  485. // CHECK-X64-NEXT: 16 | int a
  486. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  487. // CHECK-X64-NEXT: | [sizeof=24, align=8
  488. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  489. struct E : B1, B6, B3, B4, B5, virtual B0 {
  490. int a;
  491. E() : a(0x0000000E) { printf("E = %p\n", this); }
  492. };
  493. // CHECK: *** Dumping AST Record Layout
  494. // CHECK: *** Dumping AST Record Layout
  495. // CHECK-NEXT: 0 | struct E
  496. // CHECK-NEXT: 0 | struct B1 (base) (empty)
  497. // CHECK-NEXT: 2 | struct B6 (base) (empty)
  498. // CHECK-NEXT: 3 | struct B3 (base) (empty)
  499. // CHECK-NEXT: 4 | struct B4 (base) (empty)
  500. // CHECK-NEXT: 13 | struct B5 (base) (empty)
  501. // CHECK-NEXT: 8 | (E vbtable pointer)
  502. // CHECK-NEXT: 16 | int a
  503. // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
  504. // CHECK-NEXT: | [sizeof=20, align=4
  505. // CHECK-NEXT: | nvsize=20, nvalign=4]
  506. // CHECK-X64: *** Dumping AST Record Layout
  507. // CHECK-X64: *** Dumping AST Record Layout
  508. // CHECK-X64-NEXT: 0 | struct E
  509. // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
  510. // CHECK-X64-NEXT: 2 | struct B6 (base) (empty)
  511. // CHECK-X64-NEXT: 3 | struct B3 (base) (empty)
  512. // CHECK-X64-NEXT: 4 | struct B4 (base) (empty)
  513. // CHECK-X64-NEXT: 17 | struct B5 (base) (empty)
  514. // CHECK-X64-NEXT: 8 | (E vbtable pointer)
  515. // CHECK-X64-NEXT: 20 | int a
  516. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  517. // CHECK-X64-NEXT: | [sizeof=24, align=8
  518. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  519. struct F : B1, B6, B4, B8, B5, virtual B0 {
  520. int a;
  521. F() : a(0x0000000F) { printf("&a = %p\n", &a); printf("F = %p\n", this); }
  522. };
  523. // CHECK: *** Dumping AST Record Layout
  524. // CHECK-NEXT: 0 | struct F
  525. // CHECK-NEXT: 0 | struct B1 (base) (empty)
  526. // CHECK-NEXT: 2 | struct B6 (base) (empty)
  527. // CHECK-NEXT: 3 | struct B4 (base) (empty)
  528. // CHECK-NEXT: 3 | struct B8 (base)
  529. // CHECK-NEXT: 3 | char [5] c
  530. // CHECK-NEXT: 12 | struct B5 (base) (empty)
  531. // CHECK-NEXT: 8 | (F vbtable pointer)
  532. // CHECK-NEXT: 12 | int a
  533. // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
  534. // CHECK-NEXT: | [sizeof=16, align=4
  535. // CHECK-NEXT: | nvsize=16, nvalign=4]
  536. // CHECK-X64: *** Dumping AST Record Layout
  537. // CHECK-X64-NEXT: 0 | struct F
  538. // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
  539. // CHECK-X64-NEXT: 2 | struct B6 (base) (empty)
  540. // CHECK-X64-NEXT: 3 | struct B4 (base) (empty)
  541. // CHECK-X64-NEXT: 3 | struct B8 (base)
  542. // CHECK-X64-NEXT: 3 | char [5] c
  543. // CHECK-X64-NEXT: 16 | struct B5 (base) (empty)
  544. // CHECK-X64-NEXT: 8 | (F vbtable pointer)
  545. // CHECK-X64-NEXT: 16 | int a
  546. // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
  547. // CHECK-X64-NEXT: | [sizeof=24, align=8
  548. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  549. struct G : B8, B1, virtual B0 {
  550. int a;
  551. __declspec(align(16)) int a1;
  552. G() : a(0x00000010), a1(0xf0000010) { printf("G = %p\n", this); }
  553. };
  554. // CHECK: *** Dumping AST Record Layout
  555. // CHECK-NEXT: 0 | struct G
  556. // CHECK-NEXT: 0 | struct B8 (base)
  557. // CHECK-NEXT: 0 | char [5] c
  558. // CHECK-NEXT: 21 | struct B1 (base) (empty)
  559. // CHECK-NEXT: 8 | (G vbtable pointer)
  560. // CHECK-NEXT: 24 | int a
  561. // CHECK-NEXT: 32 | int a1
  562. // CHECK-NEXT: 48 | struct B0 (virtual base) (empty)
  563. // CHECK-NEXT: | [sizeof=48, align=16
  564. // CHECK-NEXT: | nvsize=48, nvalign=16]
  565. // CHECK-X64: *** Dumping AST Record Layout
  566. // CHECK-X64-NEXT: 0 | struct G
  567. // CHECK-X64-NEXT: 0 | struct B8 (base)
  568. // CHECK-X64-NEXT: 0 | char [5] c
  569. // CHECK-X64-NEXT: 21 | struct B1 (base) (empty)
  570. // CHECK-X64-NEXT: 8 | (G vbtable pointer)
  571. // CHECK-X64-NEXT: 24 | int a
  572. // CHECK-X64-NEXT: 32 | int a1
  573. // CHECK-X64-NEXT: 48 | struct B0 (virtual base) (empty)
  574. // CHECK-X64-NEXT: | [sizeof=48, align=16
  575. // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
  576. struct AX : B1X, B2X, B3X, B4X, virtual B0X {
  577. int a;
  578. AX() : a(0x0000000A) { printf(" A = %p\n", this); }
  579. };
  580. // CHECK: *** Dumping AST Record Layout
  581. // CHECK: *** Dumping AST Record Layout
  582. // CHECK: *** Dumping AST Record Layout
  583. // CHECK: *** Dumping AST Record Layout
  584. // CHECK: *** Dumping AST Record Layout
  585. // CHECK: *** Dumping AST Record Layout
  586. // CHECK-NEXT: 0 | struct AX
  587. // CHECK-NEXT: 0 | struct B1X (base) (empty)
  588. // CHECK-NEXT: 16 | struct B2X (base) (empty)
  589. // CHECK-NEXT: 18 | struct B3X (base) (empty)
  590. // CHECK-NEXT: 35 | struct B4X (base) (empty)
  591. // CHECK-NEXT: 20 | (AX vbtable pointer)
  592. // CHECK-NEXT: 36 | int a
  593. // CHECK-NEXT: 48 | struct B0X (virtual base) (empty)
  594. // CHECK-NEXT: | [sizeof=48, align=16
  595. // CHECK-NEXT: | nvsize=48, nvalign=16]
  596. // CHECK-X64: *** Dumping AST Record Layout
  597. // CHECK-X64: *** Dumping AST Record Layout
  598. // CHECK-X64: *** Dumping AST Record Layout
  599. // CHECK-X64: *** Dumping AST Record Layout
  600. // CHECK-X64: *** Dumping AST Record Layout
  601. // CHECK-X64: *** Dumping AST Record Layout
  602. // CHECK-X64-NEXT: 0 | struct AX
  603. // CHECK-X64-NEXT: 0 | struct B1X (base) (empty)
  604. // CHECK-X64-NEXT: 16 | struct B2X (base) (empty)
  605. // CHECK-X64-NEXT: 18 | struct B3X (base) (empty)
  606. // CHECK-X64-NEXT: 35 | struct B4X (base) (empty)
  607. // CHECK-X64-NEXT: 24 | (AX vbtable pointer)
  608. // CHECK-X64-NEXT: 36 | int a
  609. // CHECK-X64-NEXT: 48 | struct B0X (virtual base) (empty)
  610. // CHECK-X64-NEXT: | [sizeof=48, align=16
  611. // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
  612. struct BX : B2X, B1X, B3X, B4X, virtual B0X {
  613. int a;
  614. BX() : a(0x0000000B) { printf(" B = %p\n", this); }
  615. };
  616. // CHECK: *** Dumping AST Record Layout
  617. // CHECK-NEXT: 0 | struct BX
  618. // CHECK-NEXT: 0 | struct B2X (base) (empty)
  619. // CHECK-NEXT: 1 | struct B1X (base) (empty)
  620. // CHECK-NEXT: 2 | struct B3X (base) (empty)
  621. // CHECK-NEXT: 19 | struct B4X (base) (empty)
  622. // CHECK-NEXT: 4 | (BX vbtable pointer)
  623. // CHECK-NEXT: 20 | int a
  624. // CHECK-NEXT: 32 | struct B0X (virtual base) (empty)
  625. // CHECK-NEXT: | [sizeof=32, align=16
  626. // CHECK-NEXT: | nvsize=32, nvalign=16]
  627. // CHECK-X64: *** Dumping AST Record Layout
  628. // CHECK-X64-NEXT: 0 | struct BX
  629. // CHECK-X64-NEXT: 0 | struct B2X (base) (empty)
  630. // CHECK-X64-NEXT: 1 | struct B1X (base) (empty)
  631. // CHECK-X64-NEXT: 2 | struct B3X (base) (empty)
  632. // CHECK-X64-NEXT: 19 | struct B4X (base) (empty)
  633. // CHECK-X64-NEXT: 8 | (BX vbtable pointer)
  634. // CHECK-X64-NEXT: 20 | int a
  635. // CHECK-X64-NEXT: 32 | struct B0X (virtual base) (empty)
  636. // CHECK-X64-NEXT: | [sizeof=32, align=16
  637. // CHECK-X64-NEXT: | nvsize=32, nvalign=16]
  638. struct CX : B1X, B3X, B2X, virtual B0X {
  639. int a;
  640. CX() : a(0x0000000C) { printf(" C = %p\n", this); }
  641. };
  642. // CHECK: *** Dumping AST Record Layout
  643. // CHECK-NEXT: 0 | struct CX
  644. // CHECK-NEXT: 0 | struct B1X (base) (empty)
  645. // CHECK-NEXT: 2 | struct B3X (base) (empty)
  646. // CHECK-NEXT: 32 | struct B2X (base) (empty)
  647. // CHECK-NEXT: 16 | (CX vbtable pointer)
  648. // CHECK-NEXT: 32 | int a
  649. // CHECK-NEXT: 48 | struct B0X (virtual base) (empty)
  650. // CHECK-NEXT: | [sizeof=48, align=16
  651. // CHECK-NEXT: | nvsize=48, nvalign=16]
  652. // CHECK-X64: *** Dumping AST Record Layout
  653. // CHECK-X64-NEXT: 0 | struct CX
  654. // CHECK-X64-NEXT: 0 | struct B1X (base) (empty)
  655. // CHECK-X64-NEXT: 2 | struct B3X (base) (empty)
  656. // CHECK-X64-NEXT: 32 | struct B2X (base) (empty)
  657. // CHECK-X64-NEXT: 16 | (CX vbtable pointer)
  658. // CHECK-X64-NEXT: 32 | int a
  659. // CHECK-X64-NEXT: 48 | struct B0X (virtual base) (empty)
  660. // CHECK-X64-NEXT: | [sizeof=48, align=16
  661. // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
  662. struct DX : B8X, B1X, virtual B0X {
  663. int a;
  664. DX() : a(0x0000000D) { printf(" D = %p\n", this); }
  665. };
  666. // CHECK: *** Dumping AST Record Layout
  667. // CHECK: *** Dumping AST Record Layout
  668. // CHECK-NEXT: 0 | struct DX
  669. // CHECK-NEXT: 0 | struct B8X (base)
  670. // CHECK-NEXT: 0 | short a
  671. // CHECK-NEXT: 10 | struct B1X (base) (empty)
  672. // CHECK-NEXT: 4 | (DX vbtable pointer)
  673. // CHECK-NEXT: 12 | int a
  674. // CHECK-NEXT: 16 | struct B0X (virtual base) (empty)
  675. // CHECK-NEXT: | [sizeof=16, align=4
  676. // CHECK-NEXT: | nvsize=16, nvalign=4]
  677. // CHECK-X64: *** Dumping AST Record Layout
  678. // CHECK-X64: *** Dumping AST Record Layout
  679. // CHECK-X64-NEXT: 0 | struct DX
  680. // CHECK-X64-NEXT: 0 | struct B8X (base)
  681. // CHECK-X64-NEXT: 0 | short a
  682. // CHECK-X64-NEXT: 18 | struct B1X (base) (empty)
  683. // CHECK-X64-NEXT: 8 | (DX vbtable pointer)
  684. // CHECK-X64-NEXT: 20 | int a
  685. // CHECK-X64-NEXT: 24 | struct B0X (virtual base) (empty)
  686. // CHECK-X64-NEXT: | [sizeof=24, align=8
  687. // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
  688. struct C0 {};
  689. struct C1 : public C0 { int C1F0; };
  690. struct C2 : public C1, public C0 {};
  691. // CHECK: *** Dumping AST Record Layout
  692. // CHECK: *** Dumping AST Record Layout
  693. // CHECK: *** Dumping AST Record Layout
  694. // CHECK-NEXT: 0 | struct C2
  695. // CHECK-NEXT: 0 | struct C1 (base)
  696. // CHECK-NEXT: 0 | struct C0 (base) (empty)
  697. // CHECK-NEXT: 0 | int C1F0
  698. // CHECK-NEXT: 5 | struct C0 (base) (empty)
  699. // CHECK-NEXT: | [sizeof=8, align=4
  700. // CHECK-NEXT: | nvsize=8, nvalign=4]
  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 C2
  705. // CHECK-X64-NEXT: 0 | struct C1 (base)
  706. // CHECK-X64-NEXT: 0 | struct C0 (base) (empty)
  707. // CHECK-X64-NEXT: 0 | int C1F0
  708. // CHECK-X64-NEXT: 5 | struct C0 (base) (empty)
  709. // CHECK-X64-NEXT: | [sizeof=8, align=4
  710. // CHECK-X64-NEXT: | nvsize=8, nvalign=4]
  711. struct JA { char a; };
  712. struct JB {
  713. char a;
  714. virtual void f() {}
  715. };
  716. struct JC { char a; };
  717. struct JD : JA, JB, virtual JC {};
  718. // CHECK: *** Dumping AST Record Layout
  719. // CHECK: *** Dumping AST Record Layout
  720. // CHECK: *** Dumping AST Record Layout
  721. // CHECK: *** Dumping AST Record Layout
  722. // CHECK-NEXT: 0 | struct JD
  723. // CHECK-NEXT: 0 | struct JB (primary base)
  724. // CHECK-NEXT: 0 | (JB vftable pointer)
  725. // CHECK-NEXT: 4 | char a
  726. // CHECK-NEXT: 12 | struct JA (base)
  727. // CHECK-NEXT: 12 | char a
  728. // CHECK-NEXT: 8 | (JD vbtable pointer)
  729. // CHECK-NEXT: 16 | struct JC (virtual base)
  730. // CHECK-NEXT: 16 | char a
  731. // CHECK-NEXT: | [sizeof=17, align=4
  732. // CHECK-NEXT: | nvsize=16, nvalign=4]
  733. // CHECK-X64: *** Dumping AST Record Layout
  734. // CHECK-X64: *** Dumping AST Record Layout
  735. // CHECK-X64: *** Dumping AST Record Layout
  736. // CHECK-X64: *** Dumping AST Record Layout
  737. // CHECK-X64-NEXT: 0 | struct JD
  738. // CHECK-X64-NEXT: 0 | struct JB (primary base)
  739. // CHECK-X64-NEXT: 0 | (JB vftable pointer)
  740. // CHECK-X64-NEXT: 8 | char a
  741. // CHECK-X64-NEXT: 24 | struct JA (base)
  742. // CHECK-X64-NEXT: 24 | char a
  743. // CHECK-X64-NEXT: 16 | (JD vbtable pointer)
  744. // CHECK-X64-NEXT: 32 | struct JC (virtual base)
  745. // CHECK-X64-NEXT: 32 | char a
  746. // CHECK-X64-NEXT: | [sizeof=40, align=8
  747. // CHECK-X64-NEXT: | nvsize=32, nvalign=8]
  748. int a[
  749. sizeof(AA)+
  750. sizeof(AB)+
  751. sizeof(AC)+
  752. sizeof(AD)+
  753. sizeof(AA1)+
  754. sizeof(AB1)+
  755. sizeof(AC1)+
  756. sizeof(AD1)+
  757. sizeof(AA2)+
  758. sizeof(AB2)+
  759. sizeof(AC2)+
  760. sizeof(AD2)+
  761. sizeof(AA3)+
  762. sizeof(AB3)+
  763. sizeof(AC3)+
  764. sizeof(AD3)+
  765. sizeof(B)+
  766. sizeof(C)+
  767. sizeof(D)+
  768. sizeof(E)+
  769. sizeof(F)+
  770. sizeof(G)+
  771. sizeof(AX)+
  772. sizeof(BX)+
  773. sizeof(CX)+
  774. sizeof(DX)+
  775. sizeof(C2)+
  776. sizeof(JD)+
  777. 0];