[clang] [clang][bytecode] Fix APValues for arrays in dynamic allocations (PR #175176)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 9 06:28:38 PST 2026
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/175176
getType() returns just int for those instead of an array type, so the previous condition resulted in the array index missing int the APValue's LValuePath.
>From 6907b0e932c9a006d3a8fcfa20acc089520e8208 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Fri, 9 Jan 2026 15:23:30 +0100
Subject: [PATCH] [clang][bytecode] Fix APValues for arrays in dynamic
allocations
getType() returns just int for those instead of an array type, so the
previous condition resulted in the array index missing int the APValue's
LValuePath.
---
clang/lib/AST/ByteCode/Pointer.cpp | 4 ++--
clang/test/AST/ByteCode/new-delete.cpp | 3 +++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp
index 5d11321d09079..c5e0fd83021d7 100644
--- a/clang/lib/AST/ByteCode/Pointer.cpp
+++ b/clang/lib/AST/ByteCode/Pointer.cpp
@@ -248,7 +248,7 @@ APValue Pointer::toAPValue(const ASTContext &ASTCtx) const {
unsigned Index = Ptr.getIndex();
QualType ElemType = Desc->getElemQualType();
Offset += (Index * ASTCtx.getTypeSizeInChars(ElemType));
- if (Ptr.getArray().getType()->isArrayType())
+ if (Ptr.getArray().getFieldDesc()->IsArray)
Path.push_back(APValue::LValuePathEntry::ArrayIndex(Index));
Ptr = Ptr.getArray();
} else {
@@ -278,7 +278,7 @@ APValue Pointer::toAPValue(const ASTContext &ASTCtx) const {
} else {
Offset += (Index * ASTCtx.getTypeSizeInChars(ElemType));
}
- if (Ptr.getArray().getType()->isArrayType())
+ if (Ptr.getArray().getFieldDesc()->IsArray)
Path.push_back(APValue::LValuePathEntry::ArrayIndex(Index));
Ptr = Ptr.getArray();
} else {
diff --git a/clang/test/AST/ByteCode/new-delete.cpp b/clang/test/AST/ByteCode/new-delete.cpp
index 9345946a31e99..625f82c973372 100644
--- a/clang/test/AST/ByteCode/new-delete.cpp
+++ b/clang/test/AST/ByteCode/new-delete.cpp
@@ -14,6 +14,9 @@ constexpr int *Global = new int(12); // both-error {{must be initialized by a co
static_assert(*(new int(12)) == 12); // both-error {{not an integral constant expression}} \
// both-note {{allocation performed here was not deallocated}}
+static_assert((delete[] (new int[3] + 1), true)); // both-error {{not an integral constant expression}} \
+ // both-note {{delete of pointer to subobject '&{*new int[3]#0}[1]'}}
+
constexpr int a() {
new int(12); // both-note {{allocation performed here was not deallocated}}
More information about the cfe-commits
mailing list