1411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// from SemaCXX/class-layout.cpp
2411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// RUN: c-index-test -test-print-type-size %s -target x86_64-pc-linux-gnu | FileCheck -check-prefix=CHECK64 %s
3411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// RUN: c-index-test -test-print-type-size %s -target i386-apple-darwin9 | FileCheck -check-prefix=CHECK32 %s
4411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
5411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace basic {
6411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
7411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: VarDecl=v:[[@LINE+2]]:6 (Definition) [type=void] [typekind=Void]
8411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: VarDecl=v:[[@LINE+1]]:6 (Definition) [type=void] [typekind=Void]
9411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisvoid v;
10411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
11411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: VarDecl=v1:[[@LINE+2]]:7 (Definition) [type=void *] [typekind=Pointer] [sizeof=8] [alignof=8]
12411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: VarDecl=v1:[[@LINE+1]]:7 (Definition) [type=void *] [typekind=Pointer] [sizeof=4] [alignof=4]
13411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisvoid *v1;
14411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
15411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// offsetof
16411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=simple:[[@LINE+2]]:8 (Definition) [type=basic::simple] [typekind=Record] [sizeof=48] [alignof=8]
17411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=simple:[[@LINE+1]]:8 (Definition) [type=basic::simple] [typekind=Record] [sizeof=36] [alignof=4]
18411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct simple {
19411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int a;
20411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char b;
21411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=c:[[@LINE+1]]:7 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=40] [BitFieldSize=3]
22411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int c:3;
23411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  long d;
24411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int e:5;
25411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=f:[[@LINE+1]]:7 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=133] [BitFieldSize=4]
26411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int f:4;
27411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=g:[[@LINE+2]]:13 (Definition) [type=long long] [typekind=LongLong] [sizeof=8] [alignof=8] [offsetof=192]
28411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=g:[[@LINE+1]]:13 (Definition) [type=long long] [typekind=LongLong] [sizeof=8] [alignof=4] [offsetof=128]
29411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  long long g;
30411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=h:[[@LINE+1]]:8 (Definition) [type=char] [typekind=Char_S] [sizeof=1] [alignof=1] [offsetof=256] [BitFieldSize=3]
31411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char h:3;
32411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char i:3;
33411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  float j;
34411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=k:[[@LINE+2]]:10 (Definition) [type=char *] [typekind=Pointer] [sizeof=8] [alignof=8] [offsetof=320]
35411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=k:[[@LINE+1]]:10 (Definition) [type=char *] [typekind=Pointer] [sizeof=4] [alignof=4] [offsetof=256]
36411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char * k;
37411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
38411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
39411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
40411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: UnionDecl=u:[[@LINE+2]]:7 (Definition) [type=basic::u] [typekind=Record] [sizeof=48] [alignof=8]
41411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: UnionDecl=u:[[@LINE+1]]:7 (Definition) [type=basic::u] [typekind=Record] [sizeof=36] [alignof=4]
42411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisunion u {
43411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int u1;
44411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  long long u2;
45411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct simple s1;
46411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
47411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
48411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: VarDecl=s1:[[@LINE+2]]:8 (Definition) [type=basic::simple] [typekind=Record] [sizeof=48] [alignof=8]
49411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: VarDecl=s1:[[@LINE+1]]:8 (Definition) [type=basic::simple] [typekind=Record] [sizeof=36] [alignof=4]
50411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidissimple s1;
51411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
52411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct Test {
53411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
54411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    union {
55411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis//CHECK64: FieldDecl=foo:[[@LINE+1]]:11 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=0]
56411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      int foo;
57411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
58411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  };
59411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
60411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
61411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct Test2 {
62411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
63411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct {
64411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis//CHECK64: FieldDecl=foo:[[@LINE+1]]:11 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=0]
65411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      int foo;
66411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
67411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct {
6833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//CHECK64: FieldDecl=bar:[[@LINE+1]]:11 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=32/0]
69411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      int bar;
70411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
71411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct {
72411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        struct {
7333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//CHECK64: FieldDecl=foobar:[[@LINE+1]]:15 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=64/0]
74411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          int foobar;
75411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        };
76411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
77411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  };
78411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
79411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
80411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
81411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
82411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// these are test crash. Offsetof return values are not important.
83411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace Incomplete {
84411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// test that fields in incomplete named record do not crash
85411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisunion named {
86411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct forward_decl f1;
87411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int f2;
88411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct x {
89411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int g1;
90411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  } f3;
91411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct forward_decl f4;
92411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct x2{
93411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int g2;
94411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct forward_decl g3;
95411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  } f5;
96411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
97411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
98411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// test that fields in incomplete anonymous record do not crash
99411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisunion f {
100411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct forward_decl f1;
101411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int f2;
102411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
103411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int e1;
104411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct {
105411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      struct forward_decl2 g1;
106411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
107411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int e3;
108411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  };
109411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
110411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
111411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
112411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// incomplete not in root level, in named record
113411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct s1 {
114411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
115411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct forward_decl2 s1_g1;
116411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int s1_e1;
117411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  } s1_x; // named record shows in s1->field_iterator
118411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int s1_e3;
119411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
120411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
121411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// incomplete not in root level, in anonymous record
122411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct s1b {
123411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
124411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct forward_decl2 s1b_g1;
125411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  }; // erroneous anonymous record does not show in s1b->field_iterator
126411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int s1b_e2;
127411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
128411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
129411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct s2 {
130411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
131411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct forward_decl2 s2_g1;
132411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int s2_e1;
133411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  }; // erroneous anonymous record does not show in s1b->field_iterator
134411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int s2_e3;
135411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
136411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
137411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis//deep anonymous with deep level incomplete
138411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct s3 {
139411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
140411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int s3_e1;
141411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct {
142411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      struct {
143411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        struct {
144411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          struct {
145411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis           struct forward_decl2 s3_g1;
146411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          };
147411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        };
148411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      };
149411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
150411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int s3_e3;
151411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  };
152411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
153411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
154411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis//deep anonymous with first level incomplete
155411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct s4a {
156411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct forward_decl2 g1;
157411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
158411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis   struct forward_decl2 g2;
159411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct {
160411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      struct {
161411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        struct {
162411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          struct {
16333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//CHECK64: FieldDecl=s4_e1:[[@LINE+1]]:17 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=-1/0]
164411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis            int s4_e1;
165411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          };
166411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        };
167411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      };
168411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
169411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int s4_e3;
170411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  };
171411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
172411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
173411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis//deep anonymous with sub-first-level incomplete
174411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct s4b {
175411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
176411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct forward_decl2 g1;
177411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    struct {
178411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      struct {
179411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        struct {
180411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          struct {
181411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis            int s4b_e1;
182411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          };
183411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        };
184411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      };
185411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
186411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int s4b_e3;
187411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  };
188411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
189411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
1901a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay//named struct within anonymous struct
1911a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gaystruct s5 {
1921a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay  struct {
1931a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay    struct x {
1941a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay      int i;
1951a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay    };
1961a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay  };
1971a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay};
1981a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay
199411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=As:[[@LINE+1]]:8 [type=Incomplete::As] [typekind=Record]
200411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct As;
201411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
202411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// undefined class. Should not crash
203411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: ClassDecl=A:[[@LINE+1]]:7 [type=Incomplete::A] [typekind=Record]
204411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass A;
205411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass B {
206411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  A* a1;
207411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  A& a2;
208411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
209411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
210411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
211411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
212411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace Sizes {
213411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
214411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=A:[[@LINE+2]]:8 (Definition) [type=Sizes::A] [typekind=Record] [sizeof=8] [alignof=4]
215411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=A:[[@LINE+1]]:8 (Definition) [type=Sizes::A] [typekind=Record] [sizeof=8] [alignof=4]
216411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct A {
217411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int a;
218411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char b;
219411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
220411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
221411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=B:[[@LINE+2]]:8 (Definition) [type=Sizes::B] [typekind=Record] [sizeof=12] [alignof=4]
222411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=B:[[@LINE+1]]:8 (Definition) [type=Sizes::B] [typekind=Record] [sizeof=12] [alignof=4]
223411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct B : A {
224411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char c;
225411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
226411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
227411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=C:[[@LINE+2]]:8 (Definition) [type=Sizes::C] [typekind=Record] [sizeof=8] [alignof=4]
228411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=C:[[@LINE+1]]:8 (Definition) [type=Sizes::C] [typekind=Record] [sizeof=8] [alignof=4]
229411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct C {
230411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// Make fields private so C won't be a POD type.
231411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisprivate:
232411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int a;
233411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char b;
234411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
235411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
236411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=D:[[@LINE+2]]:8 (Definition) [type=Sizes::D] [typekind=Record] [sizeof=8] [alignof=4]
237411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=D:[[@LINE+1]]:8 (Definition) [type=Sizes::D] [typekind=Record] [sizeof=8] [alignof=4]
238411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct D : C {
239411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char c;
240411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
241411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
242411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=E:[[@LINE+2]]:32 (Definition) [type=Sizes::E] [typekind=Record] [sizeof=5] [alignof=1]
243411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=E:[[@LINE+1]]:32 (Definition) [type=Sizes::E] [typekind=Record] [sizeof=5] [alignof=1]
244411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct __attribute__((packed)) E {
245411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char b;
246411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int a;
247411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
248411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
249411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=F:[[@LINE+2]]:32 (Definition) [type=Sizes::F] [typekind=Record] [sizeof=6] [alignof=1]
250411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=F:[[@LINE+1]]:32 (Definition) [type=Sizes::F] [typekind=Record] [sizeof=6] [alignof=1]
251411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct __attribute__((packed)) F : E {
252411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char d;
253411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
254411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
255411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct G { G(); };
256411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=H:[[@LINE+2]]:8 (Definition) [type=Sizes::H] [typekind=Record] [sizeof=1] [alignof=1]
257411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=H:[[@LINE+1]]:8 (Definition) [type=Sizes::H] [typekind=Record] [sizeof=1] [alignof=1]
258411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct H : G { };
259411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
260411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=I:[[@LINE+2]]:8 (Definition) [type=Sizes::I] [typekind=Record] [sizeof=5] [alignof=1]
261411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=I:[[@LINE+1]]:8 (Definition) [type=Sizes::I] [typekind=Record] [sizeof=5] [alignof=1]
262411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct I {
263411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char b;
264411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int a;
265411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis} __attribute__((packed));
266411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
267411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
268411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
269411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace Test1 {
270411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
271411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// Test complex class hierarchy
272411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct A { };
273411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct B : A { virtual void b(); };
274411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass C : virtual A { int c; };
275411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct D : virtual B { };
276411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct E : C, virtual D { };
277411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass F : virtual E { };
278411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=G:[[@LINE+2]]:8 (Definition) [type=Test1::G] [typekind=Record] [sizeof=24] [alignof=8]
279411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=G:[[@LINE+1]]:8 (Definition) [type=Test1::G] [typekind=Record] [sizeof=16] [alignof=4]
280411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct G : virtual E, F { };
281411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
282411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
283411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
284411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace Test2 {
285411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
286411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// Test that this somewhat complex class structure is laid out correctly.
287411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct A { };
288411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct B : A { virtual void b(); };
289411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct C : virtual B { };
290411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct D : virtual A { };
291411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct E : virtual B, D { };
292411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct F : E, virtual C { };
293411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct G : virtual F, A { };
294411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=H:[[@LINE+2]]:8 (Definition) [type=Test2::H] [typekind=Record] [sizeof=24] [alignof=8]
295411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=H:[[@LINE+1]]:8 (Definition) [type=Test2::H] [typekind=Record] [sizeof=12] [alignof=4]
296411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct H { G g; };
297411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
298411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
299411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
300411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace Test3 {
301411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: ClassDecl=B:[[@LINE+2]]:7 (Definition) [type=Test3::B] [typekind=Record] [sizeof=16] [alignof=8]
302411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: ClassDecl=B:[[@LINE+1]]:7 (Definition) [type=Test3::B] [typekind=Record] [sizeof=8] [alignof=4]
303411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass B {
304411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidispublic:
305411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  virtual void b(){}
306411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=b_field:[[@LINE+2]]:8 (Definition) [type=long] [typekind=Long] [sizeof=8] [alignof=8] [offsetof=64]
307411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=b_field:[[@LINE+1]]:8 (Definition) [type=long] [typekind=Long] [sizeof=4] [alignof=4] [offsetof=32]
308411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  long b_field;
309411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisprotected:
310411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisprivate:
311411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
312411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
313411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: ClassDecl=A:[[@LINE+1]]:7 (Definition) [type=Test3::A] [typekind=Record] [sizeof=16] [alignof=4]
314411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass A : public B {
315411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidispublic:
316411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=a_field:[[@LINE+2]]:7 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=128]
317411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=a_field:[[@LINE+1]]:7 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=64]
318411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int a_field;
319411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  virtual void a(){}
320411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=one:[[@LINE+2]]:8 (Definition) [type=char] [typekind=Char_S] [sizeof=1] [alignof=1] [offsetof=160]
321411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=one:[[@LINE+1]]:8 (Definition) [type=char] [typekind=Char_S] [sizeof=1] [alignof=1] [offsetof=96]
322411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  char one;
323411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisprotected:
324411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisprivate:
325411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
326411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
327411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: ClassDecl=D:[[@LINE+2]]:7 (Definition) [type=Test3::D] [typekind=Record] [sizeof=16] [alignof=8]
328411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: ClassDecl=D:[[@LINE+1]]:7 (Definition) [type=Test3::D] [typekind=Record] [sizeof=12] [alignof=4]
329411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass D {
330411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidispublic:
331411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  virtual void b(){}
332411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=a:[[@LINE+2]]:10 (Definition) [type=double] [typekind=Double] [sizeof=8] [alignof=8] [offsetof=64]
333411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=a:[[@LINE+1]]:10 (Definition) [type=double] [typekind=Double] [sizeof=8] [alignof=4] [offsetof=32]
334411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  double a;
335411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
336411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
337411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: ClassDecl=C:[[@LINE+2]]:7 (Definition) [type=Test3::C] [typekind=Record] [sizeof=88] [alignof=8]
338411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: ClassDecl=C:[[@LINE+1]]:7 (Definition) [type=Test3::C] [typekind=Record] [sizeof=60] [alignof=4]
339411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisclass C : public virtual A,
340411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis          public D, public B {
341411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidispublic:
342411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  double c1_field;
343411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int c2_field;
344411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  double c3_field;
345411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int c4_field;
346411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  virtual void foo(){}
347411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  virtual void bar(){}
348411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisprotected:
349411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisprivate:
350411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
351411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
352411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct BaseStruct
353411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis{
354411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    BaseStruct(){}
355411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    double v0;
356411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    float v1;
357411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=fg:[[@LINE+2]]:7 (Definition) [type=Test3::C] [typekind=Record] [sizeof=88] [alignof=8] [offsetof=128]
358411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=fg:[[@LINE+1]]:7 (Definition) [type=Test3::C] [typekind=Record] [sizeof=60] [alignof=4] [offsetof=96]
359411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    C fg;
360411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: FieldDecl=rg:[[@LINE+2]]:8 (Definition) [type=Test3::C &] [typekind=LValueReference] [sizeof=88] [alignof=8] [offsetof=832]
361411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: FieldDecl=rg:[[@LINE+1]]:8 (Definition) [type=Test3::C &] [typekind=LValueReference] [sizeof=60] [alignof=4] [offsetof=576]
362411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    C &rg;
363411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int x;
364411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
365411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
366411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
367411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
368411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace NotConstantSize {
369411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
370411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisvoid f(int i) {
3714c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis// CHECK32: VarDecl=v2:[[@LINE+1]]:8 (Definition) [type=int [i]] [typekind=VariableArray] [sizeof=-4] [alignof=4]
372411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis   int v2[i];
373411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis   {
374411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis   struct CS1 {
3751a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay     int f1[i];
3761a554f72f2cf3615e5625e0922afc6b2a02a8a94Matt Beaumont-Gay     float f2;
377411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis   };
378411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis   }
379411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
380411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
381411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
382411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
383411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisnamespace CrashTest {
384411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// test crash scenarios on dependent types.
385411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidistemplate<typename T>
386411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct Foo {
387411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  T t;
388411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int a;
389411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
390411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
391411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios KyrtzidisFoo<Sizes::A> t1;
392411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios KyrtzidisFoo<Sizes::I> t2;
393411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
394411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisvoid c;
395411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
396411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisplopplop;
397411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
398411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK64: StructDecl=lastValid:[[@LINE+2]]:8 (Definition) [type=CrashTest::lastValid] [typekind=Record] [sizeof=1] [alignof=1]
399411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis// CHECK32: StructDecl=lastValid:[[@LINE+1]]:8 (Definition) [type=CrashTest::lastValid] [typekind=Record] [sizeof=1] [alignof=1]
400411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct lastValid {
401411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
402411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
403411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis}
404