]> granicus.if.org Git - clang/commitdiff
Fix bug in vector initializer when initializing a vector with another vector.
authorTanya Lattner <tonic@nondot.org>
Fri, 15 Apr 2011 22:42:59 +0000 (22:42 +0000)
committerTanya Lattner <tonic@nondot.org>
Fri, 15 Apr 2011 22:42:59 +0000 (22:42 +0000)
Add test case.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129617 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/CodeGenOpenCL/2011-04-15-vec-init-from-vec.cl [new file with mode: 0644]

index 0ec122dc353a141fd38e1f99579d36a69de611c3..14a1222cad577dc412c07cfabdcbe0692ce0a468 100644 (file)
@@ -841,6 +841,12 @@ VectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
   // becomes every element of the vector, not just the first.
   // This is the behavior described in the IBM AltiVec documentation.
   if (NumInits == 1) {
+    
+    // Handle the case where the vector is initialized by a another 
+    // vector (OpenCL 6.1.6).
+    if (E->getInit(0)->getType()->isVectorType())
+      return this->Visit(const_cast<Expr*>(E->getInit(0)));
+    
     APValue InitValue;
     if (EltTy->isIntegerType()) {
       llvm::APSInt sInt(32);
diff --git a/test/CodeGenOpenCL/2011-04-15-vec-init-from-vec.cl b/test/CodeGenOpenCL/2011-04-15-vec-init-from-vec.cl
new file mode 100644 (file)
index 0000000..8454b17
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 %s -emit-llvm -o %t
+
+typedef __attribute__((ext_vector_type(8)))  unsigned char uchar8;
+typedef __attribute__((ext_vector_type(4)))  unsigned long ulong4;
+typedef __attribute__((ext_vector_type(16))) unsigned char uchar16;
+
+// OpenCL allows vectors to be initialized by vectors Handle bug in
+// VisitInitListExpr for this case below.
+void foo( ulong4 v )
+{
+  uchar8 val[4] = {{(uchar8){((uchar16)(v.lo)).lo}}};
+}
\ No newline at end of file