[clang] c089fa5 - [clang][Interp] Fix assertion in InitElem{, Pop} ops

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 4 04:31:50 PST 2024


Author: Timm Bäder
Date: 2024-03-04T13:31:36+01:00
New Revision: c089fa5a729e217d0c0d4647656386dac1a1b135

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

LOG: [clang][Interp] Fix assertion in InitElem{,Pop} ops

... when the pointer is an unknown size array.

Added: 
    

Modified: 
    clang/lib/AST/Interp/Interp.h
    clang/test/AST/Interp/arrays.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index 84f65a33bef361..3d49f73a567621 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -1448,6 +1448,8 @@ template <PrimType Name, class T = typename PrimConv<Name>::T>
 bool InitElem(InterpState &S, CodePtr OpPC, uint32_t Idx) {
   const T &Value = S.Stk.pop<T>();
   const Pointer &Ptr = S.Stk.peek<Pointer>().atIndex(Idx);
+  if (Ptr.isUnknownSizeArray())
+    return false;
   if (!CheckInit(S, OpPC, Ptr))
     return false;
   Ptr.initialize();
@@ -1460,6 +1462,8 @@ template <PrimType Name, class T = typename PrimConv<Name>::T>
 bool InitElemPop(InterpState &S, CodePtr OpPC, uint32_t Idx) {
   const T &Value = S.Stk.pop<T>();
   const Pointer &Ptr = S.Stk.pop<Pointer>().atIndex(Idx);
+  if (Ptr.isUnknownSizeArray())
+    return false;
   if (!CheckInit(S, OpPC, Ptr))
     return false;
   Ptr.initialize();

diff  --git a/clang/test/AST/Interp/arrays.cpp b/clang/test/AST/Interp/arrays.cpp
index 2bf6e9ef35119f..4b112d7fdddfdb 100644
--- a/clang/test/AST/Interp/arrays.cpp
+++ b/clang/test/AST/Interp/arrays.cpp
@@ -138,6 +138,8 @@ constexpr int dependent[4] = {
 static_assert(dependent[2] == dependent[0], "");
 static_assert(dependent[3] == dependent[1], "");
 
+union { char x[]; } r = {0};
+
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wc99-extensions"
 #pragma clang diagnostic ignored "-Winitializer-overrides"


        


More information about the cfe-commits mailing list