[clang] c2d665b - [clang][Interp] Support ImplicitArrayInitExpr for vectors

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 22 01:59:06 PDT 2024


Author: Timm Bäder
Date: 2024-04-22T10:58:55+02:00
New Revision: c2d665b7aeb68f3e8e643ee9dfe5bb7dd31137e5

URL: https://github.com/llvm/llvm-project/commit/c2d665b7aeb68f3e8e643ee9dfe5bb7dd31137e5
DIFF: https://github.com/llvm/llvm-project/commit/c2d665b7aeb68f3e8e643ee9dfe5bb7dd31137e5.diff

LOG: [clang][Interp] Support ImplicitArrayInitExpr for vectors

Added: 
    

Modified: 
    clang/lib/AST/Interp/ByteCodeExprGen.cpp
    clang/test/AST/Interp/vectors.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 486ad9db625ddb..5b9ef9980c9cd0 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -935,6 +935,20 @@ bool ByteCodeExprGen<Emitter>::VisitImplicitValueInitExpr(const ImplicitValueIni
     return true;
   }
 
+  if (const auto *VecT = E->getType()->getAs<VectorType>()) {
+    unsigned NumVecElements = VecT->getNumElements();
+    QualType ElemQT = VecT->getElementType();
+    PrimType ElemT = classifyPrim(ElemQT);
+
+    for (unsigned I = 0; I < NumVecElements; ++I) {
+      if (!this->visitZeroInitializer(ElemT, ElemQT, E))
+        return false;
+      if (!this->emitInitElem(ElemT, I, E))
+        return false;
+    }
+    return true;
+  }
+
   return false;
 }
 

diff  --git a/clang/test/AST/Interp/vectors.cpp b/clang/test/AST/Interp/vectors.cpp
index cb8bcd4fdda768..49dae14fcf646f 100644
--- a/clang/test/AST/Interp/vectors.cpp
+++ b/clang/test/AST/Interp/vectors.cpp
@@ -25,6 +25,19 @@ static_assert(vec4_0[3] == 0.5, ""); // ref-error {{not an integral constant exp
 constexpr int vec4_0_discarded = ((float4)12.0f, 0);
 
 
+/// ImplicitValueInitExpr of vector type
+constexpr float4 arr4[2] = {
+  {1,2,3,4},
+};
+static_assert(arr4[0][0] == 1, ""); // ref-error {{not an integral constant expression}}
+static_assert(arr4[0][1] == 2, ""); // ref-error {{not an integral constant expression}}
+static_assert(arr4[0][2] == 3, ""); // ref-error {{not an integral constant expression}}
+static_assert(arr4[0][3] == 4, ""); // ref-error {{not an integral constant expression}}
+static_assert(arr4[1][0] == 0, ""); // ref-error {{not an integral constant expression}}
+static_assert(arr4[1][0] == 0, ""); // ref-error {{not an integral constant expression}}
+static_assert(arr4[1][0] == 0, ""); // ref-error {{not an integral constant expression}}
+static_assert(arr4[1][0] == 0, ""); // ref-error {{not an integral constant expression}}
+
 
 /// From constant-expression-cxx11.cpp
 namespace Vector {


        


More information about the cfe-commits mailing list