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?= <tbae...@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', ""); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits