Author: Timm Baeder
Date: 2026-09-11T16:41:17+02:00
New Revision: da252a8b6fb505e2395bbb01c2e62037dae95eb3

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

LOG: [clang][bytecode] Allow pointer type mismatch in SubPtr op (#222940)

The result of the attached test case is 1, which then gets divided by 8
and the end result is 0. This should evaluate.

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/Interp.h
    clang/test/AST/ByteCode/invalid.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 343883872728b..a20a3f91dd267 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -2876,7 +2876,8 @@ inline bool SubPtr(InterpState &S, CodePtr OpPC, uint32_t 
ElemSize) {
   if (!VR)
     return false;
 
-  assert(((int64_t)*VL - (int64_t)*VR) % ElemSize == 0);
+  // We allow (VL - VR) / Elemsize to have non-zero remainder. This happens for
+  // invalid expressions where LHS and RHS are of 
diff erent types.
   int64_t R64 =
       (static_cast<int64_t>(*VL) - static_cast<int64_t>(*VR)) / ElemSize;
   if (static_cast<int64_t>(T::from(R64)) != R64)

diff  --git a/clang/test/AST/ByteCode/invalid.cpp 
b/clang/test/AST/ByteCode/invalid.cpp
index 67c82cb352d90..2e822e0b56d91 100644
--- a/clang/test/AST/ByteCode/invalid.cpp
+++ b/clang/test/AST/ByteCode/invalid.cpp
@@ -256,3 +256,14 @@ namespace UnknownSizeArrayInEvaluateString {
   }
   }
 } // both-error {{extraneous closing brace}}
+
+namespace SubPtrResultIs1 {
+  struct A {
+    char x;
+  };
+  struct B {
+    char y;
+  };
+  struct C : A, B {};
+  unsigned char x = ((char **)(B *)(C *)0x1000) - (char *)0x1000; // 
both-error {{not pointers to compatible types}}
+}


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

Reply via email to