Author: Timm Bäder
Date: 2024-02-09T16:24:11+01:00
New Revision: d05483288465a87e75cfab51792801cfee43914c

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

LOG: [clang][Interp] Handle dummy pointers in ArrayElemPtr{,Pop} differently

Instead of returning false, just ignore the operation and return true;
This gives us the desired diagnostic behavior in the added test case.

Added: 
    

Modified: 
    clang/lib/AST/Interp/Interp.h
    clang/test/AST/Interp/c.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index bcabd93304aa29..290edc07fdc87a 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -1856,7 +1856,7 @@ inline bool ArrayElemPtr(InterpState &S, CodePtr OpPC) {
   const Pointer &Ptr = S.Stk.peek<Pointer>();
 
   if (!CheckDummy(S, OpPC, Ptr))
-    return false;
+    return true;
 
   if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
     return false;
@@ -1869,8 +1869,10 @@ inline bool ArrayElemPtrPop(InterpState &S, CodePtr 
OpPC) {
   const T &Offset = S.Stk.pop<T>();
   const Pointer &Ptr = S.Stk.pop<Pointer>();
 
-  if (!CheckDummy(S, OpPC, Ptr))
-    return false;
+  if (!CheckDummy(S, OpPC, Ptr)) {
+    S.Stk.push<Pointer>(Ptr);
+    return true;
+  }
 
   if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
     return false;

diff  --git a/clang/test/AST/Interp/c.c b/clang/test/AST/Interp/c.c
index 9ab271a82aeef9..3605462f78bbbe 100644
--- a/clang/test/AST/Interp/c.c
+++ b/clang/test/AST/Interp/c.c
@@ -129,3 +129,8 @@ _Static_assert(sizeof(name2) == 0, ""); // expected-error 
{{failed}} \
                                         // expected-note {{evaluates to}} \
                                         // pedantic-expected-error {{failed}} \
                                         // pedantic-expected-note {{evaluates 
to}}
+
+void *PR28739d = &(&PR28739d)[(__int128)(unsigned long)-1]; // 
expected-warning {{refers past the last possible element}} \
+                                                            // 
pedantic-expected-warning {{refers past the last possible element}} \
+                                                            // ref-warning 
{{refers past the last possible element}} \
+                                                            // 
pedantic-ref-warning {{refers past the last possible element}}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to