ms-x86-pack-and-align.cpp 26 KB

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