aboutsummaryrefslogtreecommitdiff
path: root/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2008-01-29 23:23:18 +0000
committerDevang Patel <dpatel@apple.com>2008-01-29 23:23:18 +0000
commit47fb6977509a285501d02611845e9f8e081a15e1 (patch)
treecc422498075ee0aa854dc7ad50faf528e7d7415c /CodeGen/CGExprConstant.cpp
parenta0f55792409289d1d343023fa8292cff6355e538 (diff)
Handle incomplete struct initializer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46534 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CGExprConstant.cpp')
-rw-r--r--CodeGen/CGExprConstant.cpp41
1 files changed, 27 insertions, 14 deletions
diff --git a/CodeGen/CGExprConstant.cpp b/CodeGen/CGExprConstant.cpp
index e03db991c4..070ce1d734 100644
--- a/CodeGen/CGExprConstant.cpp
+++ b/CodeGen/CGExprConstant.cpp
@@ -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);
}