Handle incomplete struct initializer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46534 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CGExprConstant.cpp b/CodeGen/CGExprConstant.cpp
index e03db99..070ce1d 100644
--- a/CodeGen/CGExprConstant.cpp
+++ b/CodeGen/CGExprConstant.cpp
@@ -80,19 +80,26 @@
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 @@
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);
}