diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-05-30 12:02:14 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-05-30 12:02:14 +0000 |
commit | f7fe41656c317fff867335186ae848b4d45c5a75 (patch) | |
tree | c0df1620dde13404d4766775ecf685cfcffd82ea | |
parent | 35c01c6f2da9f7ad3aceda89bf2d33a29f3eaa28 (diff) | |
download | bcm5719-llvm-f7fe41656c317fff867335186ae848b4d45c5a75.tar.gz bcm5719-llvm-f7fe41656c317fff867335186ae848b4d45c5a75.zip |
Fix constant vector init for initializer lists with an incomplete list
of elements.
llvm-svn: 51769
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 15 | ||||
-rw-r--r-- | clang/test/CodeGen/vector.c | 4 |
2 files changed, 13 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index ca7a580ef78..1144cf1c915 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/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); } diff --git a/clang/test/CodeGen/vector.c b/clang/test/CodeGen/vector.c index 52ad19fc15f..ac9922524e1 100644 --- a/clang/test/CodeGen/vector.c +++ b/clang/test/CodeGen/vector.c @@ -5,3 +5,7 @@ void f() { __v4hi A = (__v4hi)0LL; } + +__v4hi x = {1,2,3}; +__v4hi y = {1,2,3,4}; +__v4hi z = {1,2,3,4,5}; |