Author: Timm Baeder
Date: 2026-01-09T16:37:48+01:00
New Revision: ff94a19f5ca8fa928517036a287cb3040bec4261

URL: 
https://github.com/llvm/llvm-project/commit/ff94a19f5ca8fa928517036a287cb3040bec4261
DIFF: 
https://github.com/llvm/llvm-project/commit/ff94a19f5ca8fa928517036a287cb3040bec4261.diff

LOG: [clang][bytecode] Fix APValues for arrays in dynamic allocations (#175176)

getType() returns just int for those instead of an array type, so the
previous condition resulted in the array index missing in the APValue's
LValuePath.

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/Pointer.cpp
    clang/test/AST/ByteCode/new-delete.cpp

Removed: 
    


################################################################################
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 e88e970c63ba4..d77107856c30f 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}}


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to