diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -7521,6 +7521,8 @@ continue; if (It->Kind == IndirectLocalPathEntry::AddressOf) continue; + if (It->Kind == IndirectLocalPathEntry::LifetimeBoundCall) + continue; return It->Kind == IndirectLocalPathEntry::GslPointerInit || It->Kind == IndirectLocalPathEntry::GslReferenceInit; } diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp --- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -171,12 +171,22 @@ const T *begin() const; }; +template struct iter { + iter& operator-=(int); + + iter operator-(int _Off) const { + iter _Tmp = *this; + return _Tmp -= _Off; + } +}; + template struct basic_string { basic_string(); basic_string(const T *); const T *c_str() const; operator basic_string_view () const; + using const_iterator = iter; }; @@ -455,3 +465,8 @@ std::vector::iterator> iters; return iters.at(0); } + +void testForBug49342() +{ + auto it = std::iter{} - 2; // Used to be false positive. +}