From: Devang Patel Date: Wed, 24 Oct 2007 18:05:48 +0000 (+0000) Subject: Handle non-constant initializers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a83cc33195c7d1fa31d6809416eaa4c3ebf036eb;p=clang Handle non-constant initializers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43301 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp index d23473a64c..4b45980d7e 100644 --- a/CodeGen/CGExprScalar.cpp +++ b/CodeGen/CGExprScalar.cpp @@ -121,14 +121,15 @@ public: Value *VisitPreDefinedExpr(Expr *E) { return EmitLValue(E).getAddress(); } Value *VisitInitListExpr(InitListExpr *E) { - std::vector Elements; unsigned N = E->getNumInits(); + QualType T = E->getInit(0)->getType(); + Value *V = llvm::UndefValue::get(llvm::VectorType::get(ConvertType(T), N)); for (unsigned i = 0; i < N; ++i) { - Value *V = Visit(E->getInit(i)); - llvm::Constant * C = cast(V); - Elements.push_back(C); + Value *NewV = Visit(E->getInit(i)); + Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i); + V = Builder.CreateInsertElement(V, NewV, Idx); } - return llvm::ConstantVector::get(Elements); + return V; } Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { diff --git a/test/CodeGen/ocu-vector.c b/test/CodeGen/ocu-vector.c index 1c20535a58..9e904f69ff 100644 --- a/test/CodeGen/ocu-vector.c +++ b/test/CodeGen/ocu-vector.c @@ -22,3 +22,14 @@ static void test2() { vec2.yx = vec2; // reverse } +static void test3(float4 *out) { + *out = ((float4) {1.0f, 2.0f, 3.0f, 4.0f }); +} + +static void test4(float4 *out) { + float a = 1.0f; + float b = 2.0f; + float c = 3.0f; + float d = 4.0f; + *out = ((float4) {a,b,c,d}); +}