[clang] [clang][Interp] Zero-init remaining string literal elements (PR #66862)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 28 23:04:22 PDT 2023
https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/66862
>From f2b9dec7ccf73258eb74c1823e4a954a459b5d51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Wed, 20 Sep 2023 08:18:51 +0200
Subject: [PATCH] [clang][Interp] Zero-init remaining string literal elements
---
clang/lib/AST/Interp/ByteCodeExprGen.cpp | 21 +++++++++++++++++++--
clang/test/AST/Interp/arrays.cpp | 21 +++++++++++++++++++++
2 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index e813d4fa651ceaf..c2b107cef7c9708 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -858,8 +858,8 @@ bool ByteCodeExprGen<Emitter>::VisitStringLiteral(const StringLiteral *E) {
// If the initializer string is too long, a diagnostic has already been
// emitted. Read only the array length from the string literal.
- unsigned N =
- std::min(unsigned(CAT->getSize().getZExtValue()), E->getLength());
+ unsigned ArraySize = CAT->getSize().getZExtValue();
+ unsigned N = std::min(ArraySize, E->getLength());
size_t CharWidth = E->getCharByteWidth();
for (unsigned I = 0; I != N; ++I) {
@@ -878,6 +878,23 @@ bool ByteCodeExprGen<Emitter>::VisitStringLiteral(const StringLiteral *E) {
llvm_unreachable("unsupported character width");
}
}
+
+ // Fill up the rest of the char array with NUL bytes.
+ for (unsigned I = N; I != ArraySize; ++I) {
+ if (CharWidth == 1) {
+ this->emitConstSint8(0, E);
+ this->emitInitElemSint8(I, E);
+ } else if (CharWidth == 2) {
+ this->emitConstUint16(0, E);
+ this->emitInitElemUint16(I, E);
+ } else if (CharWidth == 4) {
+ this->emitConstUint32(0, E);
+ this->emitInitElemUint32(I, E);
+ } else {
+ llvm_unreachable("unsupported character width");
+ }
+ }
+
return true;
}
diff --git a/clang/test/AST/Interp/arrays.cpp b/clang/test/AST/Interp/arrays.cpp
index 5640f57f6aeb826..73d918e75db0fb5 100644
--- a/clang/test/AST/Interp/arrays.cpp
+++ b/clang/test/AST/Interp/arrays.cpp
@@ -371,3 +371,24 @@ namespace ArrayInitLoop {
// expected-note {{15 == 6}}
#endif
}
+
+namespace StringZeroFill {
+ struct A {
+ char c[6];
+ };
+ constexpr A a = { "abc" };
+ static_assert(a.c[0] == 'a', "");
+ static_assert(a.c[1] == 'b', "");
+ static_assert(a.c[2] == 'c', "");
+ static_assert(a.c[3] == '\0', "");
+ static_assert(a.c[4] == '\0', "");
+ static_assert(a.c[5] == '\0', "");
+
+ constexpr char b[6] = "foo";
+ static_assert(b[0] == 'f', "");
+ static_assert(b[1] == 'o', "");
+ static_assert(b[2] == 'o', "");
+ static_assert(b[3] == '\0', "");
+ static_assert(b[4] == '\0', "");
+ static_assert(b[5] == '\0', "");
+}
More information about the cfe-commits
mailing list