Fix the codegen of structs with flexible array members.

llvm-svn: 46806
This commit is contained in:
Eli Friedman 2008-02-06 05:33:51 +00:00
parent 3340b92582
commit 220ee41011
2 changed files with 21 additions and 5 deletions

View File

@ -323,10 +323,22 @@ const ASTRecordLayout &ASTContext::getASTRecordLayout(const RecordDecl *D,
// the future, this will need to be tweakable by targets.
for (unsigned i = 0, e = D->getNumMembers(); i != e; ++i) {
const FieldDecl *FD = D->getMember(i);
std::pair<uint64_t, unsigned> FieldInfo = getTypeInfo(FD->getType(), L);
uint64_t FieldSize = FieldInfo.first;
unsigned FieldAlign = FieldInfo.second;
uint64_t FieldSize;
unsigned FieldAlign;
if (FD->getType()->isIncompleteType()) {
// This must be a flexible array member; we can't directly
// query getTypeInfo about these, so we figure it out here.
// Flexible array members don't have any size, but they
// have to be aligned appropriately for their element type.
const ArrayType* ATy = FD->getType()->getAsArrayType();
FieldAlign = getTypeAlign(ATy->getElementType(), L);
FieldSize = 0;
} else {
std::pair<uint64_t, unsigned> FieldInfo = getTypeInfo(FD->getType(), L);
FieldSize = FieldInfo.first;
FieldAlign = FieldInfo.second;
}
// Round up the current record size to the field's alignment boundary.
RecordSize = (RecordSize+FieldAlign-1) & ~(FieldAlign-1);

View File

@ -138,6 +138,10 @@ void f12()
}
/* struct initialization */
struct a13 {int b; int c};
struct a13 {int b; int c;};
struct a13 c13 = {5};
struct a14 { short a; int b; } x = {1, 1};
/* flexible array members */
struct a15 {char a; int b[];} c15;
int a16(void) {c15.a = 1;}