[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