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