@@ -247,7 +247,8 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) {
247
247
unsigned VirtSize = 0 ;
248
248
249
249
// Helper to get a base descriptor.
250
- auto GetBaseDesc = [this ](const RecordDecl *BD, Record *BR) -> Descriptor * {
250
+ auto GetBaseDesc = [this ](const RecordDecl *BD,
251
+ const Record *BR) -> Descriptor * {
251
252
if (!BR)
252
253
return nullptr ;
253
254
return allocateDescriptor (BD, BR, std::nullopt, /* isConst=*/ false ,
@@ -258,31 +259,39 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) {
258
259
// Reserve space for base classes.
259
260
Record::BaseList Bases;
260
261
Record::VirtualBaseList VirtBases;
261
- if (auto *CD = dyn_cast<CXXRecordDecl>(RD)) {
262
+ if (const auto *CD = dyn_cast<CXXRecordDecl>(RD)) {
263
+
262
264
for (const CXXBaseSpecifier &Spec : CD->bases ()) {
263
265
if (Spec.isVirtual ())
264
266
continue ;
265
267
266
- const RecordDecl *BD = Spec.getType ()->castAs <RecordType>()->getDecl ();
267
- Record *BR = getOrCreateRecord (BD);
268
- if (Descriptor *Desc = GetBaseDesc (BD, BR)) {
269
- BaseSize += align (sizeof (InlineDescriptor));
270
- Bases.push_back ({BD, BaseSize, Desc, BR});
271
- BaseSize += align (BR->getSize ());
272
- continue ;
268
+ // In error cases, the base might not be a RecordType.
269
+ if (const auto *RT = Spec.getType ()->getAs <RecordType>()) {
270
+ const RecordDecl *BD = RT->getDecl ();
271
+
272
+ Record *BR = getOrCreateRecord (BD);
273
+ if (Descriptor *Desc = GetBaseDesc (BD, BR)) {
274
+ BaseSize += align (sizeof (InlineDescriptor));
275
+ Bases.push_back ({BD, BaseSize, Desc, BR});
276
+ BaseSize += align (BR->getSize ());
277
+ continue ;
278
+ }
273
279
}
274
280
return nullptr ;
275
281
}
276
282
277
283
for (const CXXBaseSpecifier &Spec : CD->vbases ()) {
278
- const RecordDecl *BD = Spec.getType ()->castAs <RecordType>()->getDecl ();
279
- Record *BR = getOrCreateRecord (BD);
280
284
281
- if (Descriptor *Desc = GetBaseDesc (BD, BR)) {
282
- VirtSize += align (sizeof (InlineDescriptor));
283
- VirtBases.push_back ({BD, VirtSize, Desc, BR});
284
- VirtSize += align (BR->getSize ());
285
- continue ;
285
+ if (const auto *RT = Spec.getType ()->getAs <RecordType>()) {
286
+ const RecordDecl *BD = RT->getDecl ();
287
+ Record *BR = getOrCreateRecord (BD);
288
+
289
+ if (Descriptor *Desc = GetBaseDesc (BD, BR)) {
290
+ VirtSize += align (sizeof (InlineDescriptor));
291
+ VirtBases.push_back ({BD, VirtSize, Desc, BR});
292
+ VirtSize += align (BR->getSize ());
293
+ continue ;
294
+ }
286
295
}
287
296
return nullptr ;
288
297
}
0 commit comments