@@ -156,22 +156,41 @@ class CompilerBackend {
156
156
offset = GetType(node.inheritsFrom).size;
157
157
}
158
158
159
+ UsedType* [] copiesOfMe;
160
+
159
161
foreach (ref member ; node.members) {
160
- if (! TypeExists(member.type.name)) {
162
+ bool canUseMyself = false ;
163
+
164
+ if ((member.type.name == node.name) && member.type.ptr) {
165
+ canUseMyself = true ;
166
+ }
167
+
168
+ if (! canUseMyself && ! TypeExists(member.type.name)) {
161
169
Error(node.error, " Type '%s' doesn't exist" , member.type.name);
162
170
}
163
171
if (members.canFind(member.name)) {
164
172
Error(node.error, " Duplicate member '%s'" , member.name);
165
173
}
166
174
167
- UsedType memberType = UsedType(GetType(member.type.name), member.type.ptr);
168
- memberType.ptr = member.type.ptr;
175
+ UsedType memberType;
176
+ if (canUseMyself) {
177
+ memberType = UsedType(
178
+ Type.init, member.type.ptr
179
+ );
180
+ }
181
+ else {
182
+ memberType = UsedType(
183
+ GetType(member.type.name), member.type.ptr
184
+ );
185
+ }
186
+ memberType.ptr = member.type.ptr;
169
187
170
188
auto newMember = StructEntry(
171
189
memberType, member.name, member.array, memberType.Size(), offset
172
190
);
173
- entries ~= newMember;
174
- members ~= member.name;
191
+ entries ~= newMember;
192
+ members ~= member.name;
193
+ copiesOfMe ~= &entries[$ - 1 ].type;
175
194
176
195
offset += newMember.array?
177
196
newMember.type.Size() * newMember.size : newMember.type.Size();
@@ -183,6 +202,10 @@ class CompilerBackend {
183
202
184
203
NewConst(format(" %s.sizeOf" , node.name), offset);
185
204
types ~= Type(node.name, offset, true , entries);
205
+
206
+ foreach (ref me ; copiesOfMe) {
207
+ * me = UsedType(types[$ - 1 ], true );
208
+ }
186
209
}
187
210
188
211
void CompileEnum (EnumNode node) {
0 commit comments