[clang] [clang][bytecode] Fix emitting dtors of zero-sized arrays (PR #134672)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 7 08:26:52 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
Desc->getNumElems() returning 0 made us underflow here.
---
Full diff: https://github.com/llvm/llvm-project/pull/134672.diff
2 Files Affected:
- (modified) clang/lib/AST/ByteCode/Compiler.cpp (+11-9)
- (modified) clang/test/AST/ByteCode/cxx23.cpp (+12)
``````````diff
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 021acbd798646..9e9252558b1a9 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -6818,15 +6818,17 @@ bool Compiler<Emitter>::emitDestruction(const Descriptor *Desc,
return true;
}
- for (ssize_t I = Desc->getNumElems() - 1; I >= 0; --I) {
- if (!this->emitConstUint64(I, Loc))
- return false;
- if (!this->emitArrayElemPtrUint64(Loc))
- return false;
- if (!this->emitDestruction(ElemDesc, Loc))
- return false;
- if (!this->emitPopPtr(Loc))
- return false;
+ if (size_t N = Desc->getNumElems()) {
+ for (ssize_t I = N - 1; I >= 0; --I) {
+ if (!this->emitConstUint64(I, Loc))
+ return false;
+ if (!this->emitArrayElemPtrUint64(Loc))
+ return false;
+ if (!this->emitDestruction(ElemDesc, Loc))
+ return false;
+ if (!this->emitPopPtr(Loc))
+ return false;
+ }
}
return true;
}
diff --git a/clang/test/AST/ByteCode/cxx23.cpp b/clang/test/AST/ByteCode/cxx23.cpp
index 6a62ac11cde79..d0ade4f5278b1 100644
--- a/clang/test/AST/ByteCode/cxx23.cpp
+++ b/clang/test/AST/ByteCode/cxx23.cpp
@@ -304,3 +304,15 @@ namespace NonLiteralDtorInParam {
// expected23-note {{non-constexpr function '~NonLiteral' cannot be used in a constant expression}}
}
}
+
+namespace ZeroSizedArray {
+ struct S {
+ constexpr ~S() {
+ }
+ };
+ constexpr int foo() {
+ S s[0];
+ return 1;
+ }
+ static_assert(foo() == 1);
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/134672
More information about the cfe-commits
mailing list