@@ -248,7 +248,7 @@ Address CodeGen::emitMergePHI(CodeGenFunction &CGF, Address Addr1,
248
248
return Address (PHI, Addr1.getElementType (), Align);
249
249
}
250
250
251
- bool CodeGen::isEmptyField (const ASTContext &Context, const FieldDecl *FD,
251
+ bool CodeGen::isEmptyField (ASTContext &Context, const FieldDecl *FD,
252
252
bool AllowArrays, bool AsIfNoUniqueAddr) {
253
253
if (FD->isUnnamedBitField ())
254
254
return true ;
@@ -289,6 +289,27 @@ bool CodeGen::isEmptyField(const ASTContext &Context, const FieldDecl *FD,
289
289
return isEmptyRecord (Context, FT, AllowArrays, AsIfNoUniqueAddr);
290
290
}
291
291
292
+ bool CodeGen::isEmptyRecord (ASTContext &Context, QualType T, bool AllowArrays,
293
+ bool AsIfNoUniqueAddr) {
294
+ const RecordType *RT = T->getAs <RecordType>();
295
+ if (!RT)
296
+ return false ;
297
+ const RecordDecl *RD = RT->getDecl ();
298
+ if (RD->hasFlexibleArrayMember ())
299
+ return false ;
300
+
301
+ // If this is a C++ record, check the bases first.
302
+ if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
303
+ for (const auto &I : CXXRD->bases ())
304
+ if (!isEmptyRecord (Context, I.getType (), true , AsIfNoUniqueAddr))
305
+ return false ;
306
+
307
+ for (const auto *I : RD->fields ())
308
+ if (!isEmptyField (Context, I, AllowArrays, AsIfNoUniqueAddr))
309
+ return false ;
310
+ return true ;
311
+ }
312
+
292
313
bool CodeGen::isEmptyFieldForLayout (const ASTContext &Context,
293
314
const FieldDecl *FD) {
294
315
if (FD->isZeroLengthBitField (Context))
@@ -297,34 +318,27 @@ bool CodeGen::isEmptyFieldForLayout(const ASTContext &Context,
297
318
if (FD->isUnnamedBitField ())
298
319
return false ;
299
320
300
- return isEmptyField (Context, FD, /* AllowArrays=*/ false ,
301
- /* AsIfNoUniqueAddr=*/ true );
321
+ return isEmptyRecordForLayout (Context, FD->getType ());
302
322
}
303
323
304
- bool CodeGen::isEmptyRecord (const ASTContext &Context, QualType T,
305
- bool AllowArrays, bool AsIfNoUniqueAddr) {
324
+ bool CodeGen::isEmptyRecordForLayout (const ASTContext &Context, QualType T) {
306
325
const RecordType *RT = T->getAs <RecordType>();
307
326
if (!RT)
308
327
return false ;
328
+
309
329
const RecordDecl *RD = RT->getDecl ();
310
- if (RD->hasFlexibleArrayMember ())
311
- return false ;
312
330
313
331
// If this is a C++ record, check the bases first.
314
332
if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
315
333
for (const auto &I : CXXRD->bases ())
316
- if (!isEmptyRecord (Context, I.getType (), true , AsIfNoUniqueAddr ))
334
+ if (!isEmptyRecordForLayout (Context, I.getType ()))
317
335
return false ;
318
336
319
337
for (const auto *I : RD->fields ())
320
- if (!isEmptyField (Context, I, AllowArrays, AsIfNoUniqueAddr ))
338
+ if (!isEmptyFieldForLayout (Context, I))
321
339
return false ;
322
- return true ;
323
- }
324
340
325
- bool CodeGen::isEmptyRecordForLayout (const ASTContext &Context, QualType T) {
326
- return isEmptyRecord (Context, T, /* AllowArrays=*/ false ,
327
- /* AsIfNoUniqueAddr=*/ true );
341
+ return true ;
328
342
}
329
343
330
344
const Type *CodeGen::isSingleElementStruct (QualType T, ASTContext &Context) {
0 commit comments