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

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