aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGCall.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-05-11 23:01:34 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-05-11 23:01:34 +0000
commitcc401dc651a91f53f9f9a39956732be8f537e7fa (patch)
tree22bacf84e479b8b5fb35e31f64ee8030af72cc19 /lib/CodeGen/CGCall.cpp
parent0033836b3c4bb578ef999813de4f5f1a24862d18 (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.cpp21
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 {