[clang] dd6738d - [clang][Lifetimes] Fix false positive warning from BUG 49342

Gabor Horvath via cfe-commits cfe-commits at lists.llvm.org
Sat Feb 27 08:16:02 PST 2021


Author: Gabor Horvath
Date: 2021-02-27T08:09:57-08:00
New Revision: dd6738d93de148f2239ef5be82a61cf8f5f71124

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

LOG: [clang][Lifetimes] Fix false positive warning from BUG 49342

Differential Revision: https://reviews.llvm.org/D97605

Added: 
    

Modified: 
    clang/lib/Sema/SemaInit.cpp
    clang/test/Sema/warn-lifetime-analysis-nocfg.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index c1a2be744853..f387e9a33708 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -7521,6 +7521,8 @@ static bool pathOnlyInitializesGslPointer(IndirectLocalPath &Path) {
       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
index 3319d5aa2db8..b3ca173c1fdb 100644
--- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
+++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
@@ -171,12 +171,22 @@ struct basic_string_view {
   const T *begin() const;
 };
 
+template<class _Mystr> struct iter {
+    iter& operator-=(int);
+
+    iter operator-(int _Off) const {
+        iter _Tmp = *this;
+        return _Tmp -= _Off;
+    }
+};
+
 template<typename T>
 struct basic_string {
   basic_string();
   basic_string(const T *);
   const T *c_str() const;
   operator basic_string_view<T> () const;
+  using const_iterator = iter<T>;
 };
 
 
@@ -455,3 +465,8 @@ std::vector<int>::iterator noFalsePositiveWithVectorOfPointers() {
   std::vector<std::vector<int>::iterator> iters;
   return iters.at(0);
 }
+
+void testForBug49342()
+{
+  auto it = std::iter<char>{} - 2; // Used to be false positive.
+}


        


More information about the cfe-commits mailing list