зеркало из https://github.com/microsoft/clang.git
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:
Родитель
0033836b3c
Коммит
cc401dc651
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче