@@ -248,7 +248,7 @@ Address CodeGen::emitMergePHI(CodeGenFunction &CGF, Address Addr1,
248248 return Address (PHI, Addr1.getElementType (), Align);
249249}
250250
251- bool CodeGen::isEmptyField (const ASTContext &Context, const FieldDecl *FD,
251+ bool CodeGen::isEmptyField (ASTContext &Context, const FieldDecl *FD,
252252 bool AllowArrays, bool AsIfNoUniqueAddr) {
253253 if (FD->isUnnamedBitField ())
254254 return true ;
@@ -289,6 +289,27 @@ bool CodeGen::isEmptyField(const ASTContext &Context, const FieldDecl *FD,
289289 return isEmptyRecord (Context, FT, AllowArrays, AsIfNoUniqueAddr);
290290}
291291
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+
292313bool CodeGen::isEmptyFieldForLayout (const ASTContext &Context,
293314 const FieldDecl *FD) {
294315 if (FD->isZeroLengthBitField (Context))
@@ -297,34 +318,27 @@ bool CodeGen::isEmptyFieldForLayout(const ASTContext &Context,
297318 if (FD->isUnnamedBitField ())
298319 return false ;
299320
300- return isEmptyField (Context, FD, /* AllowArrays=*/ false ,
301- /* AsIfNoUniqueAddr=*/ true );
321+ return isEmptyRecordForLayout (Context, FD->getType ());
302322}
303323
304- bool CodeGen::isEmptyRecord (const ASTContext &Context, QualType T,
305- bool AllowArrays, bool AsIfNoUniqueAddr) {
324+ bool CodeGen::isEmptyRecordForLayout (const ASTContext &Context, QualType T) {
306325 const RecordType *RT = T->getAs <RecordType>();
307326 if (!RT)
308327 return false ;
328+
309329 const RecordDecl *RD = RT->getDecl ();
310- if (RD->hasFlexibleArrayMember ())
311- return false ;
312330
313331 // If this is a C++ record, check the bases first.
314332 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
315333 for (const auto &I : CXXRD->bases ())
316- if (!isEmptyRecord (Context, I.getType (), true , AsIfNoUniqueAddr ))
334+ if (!isEmptyRecordForLayout (Context, I.getType ()))
317335 return false ;
318336
319337 for (const auto *I : RD->fields ())
320- if (!isEmptyField (Context, I, AllowArrays, AsIfNoUniqueAddr ))
338+ if (!isEmptyFieldForLayout (Context, I))
321339 return false ;
322- return true ;
323- }
324340
325- bool CodeGen::isEmptyRecordForLayout (const ASTContext &Context, QualType T) {
326- return isEmptyRecord (Context, T, /* AllowArrays=*/ false ,
327- /* AsIfNoUniqueAddr=*/ true );
341+ return true ;
328342}
329343
330344const Type *CodeGen::isSingleElementStruct (QualType T, ASTContext &Context) {
0 commit comments