diff --git a/clang/lib/StaticAnalyzer/Checkers/IteratorRangeChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/IteratorRangeChecker.cpp index c682449921acc..7740c3d4da1ec 100644 --- a/clang/lib/StaticAnalyzer/Checkers/IteratorRangeChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/IteratorRangeChecker.cpp @@ -228,7 +228,7 @@ void IteratorRangeChecker::verifyRandomIncrOrDecr(CheckerContext &C, Value = State->getRawSVal(*ValAsLoc); } - if (Value.isUnknownOrUndef()) + if (Value.isUnknownOrUndef() || !isa(Value)) return; // Incremention or decremention by 0 is never a bug. diff --git a/clang/test/Analysis/iterator-range.cpp b/clang/test/Analysis/iterator-range.cpp index 849a1e9814ae3..ba5d0144775e9 100644 --- a/clang/test/Analysis/iterator-range.cpp +++ b/clang/test/Analysis/iterator-range.cpp @@ -946,3 +946,14 @@ int uninit_var(int n) { // expected-warning@-1 {{The right operand of '-' is a garbage value}} // expected-note@-2 {{The right operand of '-' is a garbage value}} } + +namespace std { +namespace ranges { + template + InOutIter next(InOutIter, Sentinel); +} // namespace ranges +} // namespace std + +void gh65009__no_crash_on_ranges_next(int **begin, int **end) { + (void)std::ranges::next(begin, end); // no-crash +}