From e600d4be7d01661ab7601f9ef9c4d3236c377385 Mon Sep 17 00:00:00 2001
From: Anna Zaks <ganna@apple.com>
Date: Tue, 9 Jul 2013 01:55:00 +0000
Subject: [PATCH] [analyzer] Fixup for r185609: actually do suppress warnings
 coming out of std::list.

list is the name of a class, not a namespace. Change the test as well - the previous
version did not test properly.

Fixes radar://14317928.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185898 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/StaticAnalyzer/Core/BugReporterVisitors.cpp    | 8 ++++----
 test/Analysis/Inputs/system-header-simulator-cxx.h | 8 +++++++-
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index 70354fe21c3..fc81d1cc11e 100644
--- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -1541,12 +1541,12 @@ LikelyFalsePositiveSuppressionBRVisitor::getEndPath(BugReporterContext &BRC,
       // The analyzer issues a false use-after-free when std::list::pop_front
       // or std::list::pop_back are called multiple times because we cannot
       // reason about the internal invariants of the datastructure.
-      const DeclContext *DC =
-        D->getDeclContext()->getEnclosingNamespaceContext();
-      const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC);
-      if (ND && ND->getName() == "list") {
+      if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
+        const CXXRecordDecl *CD = MD->getParent();
+        if (CD->getName() == "list") {
           BR.markInvalid(getTag(), 0);
           return 0;
+        }
       }
     }
   }
diff --git a/test/Analysis/Inputs/system-header-simulator-cxx.h b/test/Analysis/Inputs/system-header-simulator-cxx.h
index 049d6be91b4..8e96508ba58 100644
--- a/test/Analysis/Inputs/system-header-simulator-cxx.h
+++ b/test/Analysis/Inputs/system-header-simulator-cxx.h
@@ -99,7 +99,13 @@ namespace std {
   : private __list_imp<_Tp, _Alloc>
   {
   public:
-    void pop_front();
+    void pop_front() {
+      // Fake use-after-free.
+      // No warning is expected as we are suppressing warning comming
+      // out of std::list.
+      int z = 0;
+      z = 5/z;
+    }
     bool empty() const;
   };
 
-- 
GitLab