[clang] 09bbc90 - [clang][Interp] Array initialization via ImplicitValueInitExpr
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 21 01:50:18 PDT 2022
Author: Timm Bäder
Date: 2022-10-21T10:49:45+02:00
New Revision: 09bbc903a5b454d39d5ce69cf8bf6d5e1b46e3c4
URL: https://github.com/llvm/llvm-project/commit/09bbc903a5b454d39d5ce69cf8bf6d5e1b46e3c4
DIFF: https://github.com/llvm/llvm-project/commit/09bbc903a5b454d39d5ce69cf8bf6d5e1b46e3c4.diff
LOG: [clang][Interp] Array initialization via ImplicitValueInitExpr
Differential Revision: https://reviews.llvm.org/D135013
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/arrays.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index ad3348cee4e2f..872bbf045cef2 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -721,6 +721,27 @@ bool ByteCodeExprGen<Emitter>::visitArrayInitializer(const Expr *Initializer) {
if (!this->emitPopPtr(Initializer))
return false;
}
+ return true;
+ } else if (const auto *IVIE = dyn_cast<ImplicitValueInitExpr>(Initializer)) {
+ const ArrayType *AT = IVIE->getType()->getAsArrayTypeUnsafe();
+ assert(AT);
+ const auto *CAT = cast<ConstantArrayType>(AT);
+ size_t NumElems = CAT->getSize().getZExtValue();
+
+ if (Optional<PrimType> ElemT = classify(CAT->getElementType())) {
+ // TODO(perf): For int and bool types, we can probably just skip this
+ // since we memset our Block*s to 0 and so we have the desired value
+ // without this.
+ for (size_t I = 0; I != NumElems; ++I) {
+ if (!this->emitZero(*ElemT, Initializer))
+ return false;
+ if (!this->emitInitElem(*ElemT, I, Initializer))
+ return false;
+ }
+ } else {
+ assert(false && "default initializer for non-primitive type");
+ }
+
return true;
}
diff --git a/clang/test/AST/Interp/arrays.cpp b/clang/test/AST/Interp/arrays.cpp
index 318793ff777a0..d41999414f5b6 100644
--- a/clang/test/AST/Interp/arrays.cpp
+++ b/clang/test/AST/Interp/arrays.cpp
@@ -117,3 +117,15 @@ namespace indices {
// expected-error {{must be initialized by a constant expression}} \
// expected-note {{cannot refer to element -2 of array of 10}}
};
+
+namespace DefaultInit {
+ template <typename T, unsigned N>
+ struct B {
+ T a[N];
+ };
+
+ int f() {
+ constexpr B<int,10> arr = {};
+ constexpr int x = arr.a[0];
+ }
+};
More information about the cfe-commits
mailing list