diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-05-11 23:01:34 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-05-11 23:01:34 +0000 |
commit | cc401dc651a91f53f9f9a39956732be8f537e7fa (patch) | |
tree | 22bacf84e479b8b5fb35e31f64ee8030af72cc19 /lib/CodeGen/CGCall.cpp | |
parent | 0033836b3c4bb578ef999813de4f5f1a24862d18 (diff) |
Darwin x86-32: Multi-dimensional arrays were not handled correctly,
spotted by Eli!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71490 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 36b6b92ab8..c46e7901d9 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -166,10 +166,9 @@ static bool isEmptyField(ASTContext &Context, const FieldDecl *FD) { return true; QualType FT = FD->getType(); - // Arrays of empty records count as empty. - if (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) - if (isEmptyRecord(Context, AT->getElementType())) - return true; + // Constant arrays of empty records count as empty, strip them off. + while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) + FT = AT->getElementType(); return isEmptyRecord(Context, FT); } @@ -218,14 +217,18 @@ static const Type *isSingleElementStruct(QualType T, ASTContext &Context) { if (isEmptyField(Context, FD)) continue; - // Treat single element arrays as the element - if (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) - if (AT->getSize().getZExtValue() == 1) - FT = AT->getElementType(); - + // If we already found an element then this isn't a single-element + // struct. if (Found) return 0; + // Treat single element arrays as the element. + while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) { + if (AT->getSize().getZExtValue() != 1) + break; + FT = AT->getElementType(); + } + if (!CodeGenFunction::hasAggregateLLVMType(FT)) { Found = FT.getTypePtr(); } else { |