Author: Timm Baeder Date: 2025-03-17T19:02:55+01:00 New Revision: cfa07ccdfcf03cbd48086fe9988f97e3a776b02c
URL: https://github.com/llvm/llvm-project/commit/cfa07ccdfcf03cbd48086fe9988f97e3a776b02c DIFF: https://github.com/llvm/llvm-project/commit/cfa07ccdfcf03cbd48086fe9988f97e3a776b02c.diff LOG: [clang][bytecode] Fix builtin_memchr with non-0 start index (#131633) Added: Modified: clang/lib/AST/ByteCode/InterpBuiltin.cpp clang/test/AST/ByteCode/builtin-functions.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 4660c80fc90db..3fa8fbc22ec03 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -2045,8 +2045,10 @@ static bool interp__builtin_memchr(InterpState &S, CodePtr OpPC, (ID == Builtin::BIstrchr || ID == Builtin::BI__builtin_strchr); size_t Index = Ptr.getIndex(); + size_t Step = 0; for (;;) { - const Pointer &ElemPtr = Index > 0 ? Ptr.atIndex(Index) : Ptr; + const Pointer &ElemPtr = + (Index + Step) > 0 ? Ptr.atIndex(Index + Step) : Ptr; if (!CheckLoad(S, OpPC, ElemPtr)) return false; @@ -2060,8 +2062,8 @@ static bool interp__builtin_memchr(InterpState &S, CodePtr OpPC, if (StopAtZero && V == 0) break; - ++Index; - if (MaxLength && Index == MaxLength->getZExtValue()) + ++Step; + if (MaxLength && Step == MaxLength->getZExtValue()) break; } diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp index 29812553af9f0..11ff48bfa7102 100644 --- a/clang/test/AST/ByteCode/builtin-functions.cpp +++ b/clang/test/AST/ByteCode/builtin-functions.cpp @@ -1459,6 +1459,11 @@ namespace Memchr { constexpr bool b = !memchr("hello", 'h', 3); // both-error {{constant expression}} \ // both-note {{non-constexpr function 'memchr' cannot be used in a constant expression}} + constexpr bool f() { + const char *c = "abcdef"; + return __builtin_char_memchr(c + 1, 'f', 1) == nullptr; + } + static_assert(f()); } namespace Strchr { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits