ms-x86-basic-layout.cpp 30 KB

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