diff options
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index ca7a580ef7..1144cf1c91 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -242,20 +242,23 @@ public: 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(); + + unsigned NumInitableElts = std::min(NumInitElements, NumElements); - // FIXME: Handle case in assertion correctly - assert (NumInitElements == NumElements - && "Unsufficient vector init elelments"); // 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); } |