Fix constant vector init for initializer lists with an incomplete list
of elements.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51769 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index ca7a580..1144cf1 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -242,20 +242,23 @@
llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) {
const llvm::VectorType *VType =
cast<llvm::VectorType>(ConvertType(ILE->getType()));
- std::vector<llvm::Constant*> Elts;
- unsigned NumInitElements = ILE->getNumInits();
+ const llvm::Type *ElemTy = VType->getElementType();
+ std::vector<llvm::Constant*> Elts;
unsigned NumElements = VType->getNumElements();
+ unsigned NumInitElements = ILE->getNumInits();
- // FIXME: Handle case in assertion correctly
- assert (NumInitElements == NumElements
- && "Unsufficient vector init elelments");
+ unsigned NumInitableElts = std::min(NumInitElements, NumElements);
+
// Copy initializer elements.
unsigned i = 0;
- for (; i < NumElements; ++i) {
+ for (; i < NumInitableElts; ++i) {
llvm::Constant *C = Visit(ILE->getInit(i));
Elts.push_back(C);
}
+ for (; i < NumElements; ++i)
+ Elts.push_back(llvm::Constant::getNullValue(ElemTy));
+
return llvm::ConstantVector::get(VType, Elts);
}