Handle incomplete struct initializer.

llvm-svn: 46534
This commit is contained in:
Devang Patel
2008-01-29 23:23:18 +00:00
parent 284011b462
commit 45a65d2ee1
2 changed files with 32 additions and 15 deletions

View File

@@ -80,19 +80,26 @@ public:
unsigned NumInitableElts = NumInitElements;
std::vector<llvm::Constant*> Elts;
// Initialising an array requires us to automatically initialise any
// elements that have not been initialised explicitly
// Initialising an array or structure requires us to automatically
// initialise any elements that have not been initialised explicitly
const llvm::ArrayType *AType = 0;
const llvm::Type *AElemTy = 0;
unsigned NumArrayElements = 0;
const llvm::StructType *SType = 0;
const llvm::Type *ElemTy = 0;
unsigned NumElements = 0;
// If this is an array, we may have to truncate the initializer
if ((AType = dyn_cast<llvm::ArrayType>(CType))) {
NumArrayElements = AType->getNumElements();
AElemTy = AType->getElementType();
NumInitableElts = std::min(NumInitableElts, NumArrayElements);
NumElements = AType->getNumElements();
ElemTy = AType->getElementType();
NumInitableElts = std::min(NumInitableElts, NumElements);
}
// If this is a structure, we may have to truncate the initializer
if ((SType = dyn_cast<llvm::StructType>(CType))) {
NumElements = SType->getNumElements();
NumInitableElts = std::min(NumInitableElts, NumElements);
}
// Copy initializer elements.
unsigned i = 0;
for (i = 0; i < NumInitableElts; ++i) {
@@ -107,19 +114,25 @@ public:
Elts.push_back(C);
}
if (ILE->getType()->isStructureType())
return llvm::ConstantStruct::get(cast<llvm::StructType>(CType), Elts);
if (SType) {
// Initialize remaining structure elements.
for (; i < NumElements; ++i) {
ElemTy = SType->getElementType(i);
Elts.push_back(llvm::Constant::getNullValue(ElemTy));
}
return llvm::ConstantStruct::get(SType, Elts);
}
if (ILE->getType()->isVectorType())
return llvm::ConstantVector::get(cast<llvm::VectorType>(CType), Elts);
// Make sure we have an array at this point
assert(AType);
// Initialize remaining array elements.
for (; i < NumArrayElements; ++i)
Elts.push_back(llvm::Constant::getNullValue(AElemTy));
for (; i < NumElements; ++i)
Elts.push_back(llvm::Constant::getNullValue(ElemTy));
return llvm::ConstantArray::get(AType, Elts);
}

View File

@@ -135,4 +135,8 @@ void f12()
const struct _a a2;
a1 = a2;
}
}
/* struct initialization */
struct a13 {int b; int c};
struct a13 c13 = {5};