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
This commit is contained in:
Daniel Dunbar 2009-05-11 23:01:34 +00:00
Родитель 0033836b3c
Коммит cc401dc651
2 изменённых файлов: 18 добавлений и 9 удалений

Просмотреть файл

@ -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 {

Просмотреть файл

@ -145,4 +145,10 @@ struct s34 { struct { int : 0 } a; float b; } f34(void) {}
// RUN: grep 'define i16 @f35()' %t &&
struct s35 { struct { int : 0 } a; char b; char c; } f35(void) {}
// RUN: grep 'define i16 @f36()' %t &&
struct s36 { struct { int : 0 } a[2][10]; char b; char c; } f36(void) {}
// RUN: grep 'define float @f37()' %t &&
struct s37 { float c[1][1]; } f37(void) {}
// RUN: true