]> granicus.if.org Git - clang/commitdiff
Use a deque instead of an ImmutableList in AnalysisConsumer to preserve the file...
authorTed Kremenek <kremenek@apple.com>
Fri, 27 Apr 2012 04:54:28 +0000 (04:54 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 27 Apr 2012 04:54:28 +0000 (04:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155693 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/StaticAnalyzer/Core/PathSensitive/FunctionSummary.h
lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
test/Analysis/nil-receiver-undefined-larger-than-voidptr-ret.m

index 3f7243293598b695e236dc235591817423a4efe5..cf4a6929a3aa71d240daeeef2eb0b32091a989b8 100644 (file)
 #ifndef LLVM_CLANG_GR_FUNCTIONSUMMARY_H
 #define LLVM_CLANG_GR_FUNCTIONSUMMARY_H
 
+#include <deque>
 #include "clang/AST/Decl.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/BitVector.h"
-#include "llvm/ADT/ImmutableList.h"
 
 namespace clang {
 namespace ento {
-typedef llvm::ImmutableList<Decl*> SetOfDecls;
+typedef std::deque<Decl*> SetOfDecls;
 typedef llvm::DenseSet<const Decl*> SetOfConstDecls;
 
 class FunctionSummariesTy {
index dd60b201f810b473169e4ae1025e706c5029cfd6..ae783230f6894c4b824f31c03e838d18a84355eb 100644 (file)
@@ -102,8 +102,6 @@ public:
   /// The local declaration to all declarations ratio might be very small when
   /// working with a PCH file.
   SetOfDecls LocalTUDecls;
-
-  SetOfDecls::Factory LocalTUDeclsFactory;
                            
   // PD is owned by AnalysisManager.
   PathDiagnosticConsumer *PD;
@@ -308,9 +306,7 @@ void AnalysisConsumer::storeTopLevelDecls(DeclGroupRef DG) {
     if (isa<ObjCMethodDecl>(*I))
       continue;
 
-    // We use an ImmutableList to avoid issues with invalidating iterators
-    // to the list while we are traversing it.
-    LocalTUDecls = LocalTUDeclsFactory.add(*I, LocalTUDecls);
+    LocalTUDecls.push_back(*I);
   }
 }
 
@@ -319,9 +315,6 @@ void AnalysisConsumer::HandleDeclsGallGraph() {
   // Build the Call Graph.
   CallGraph CG;
   // Add all the top level declarations to the graph.
-  //
-  // NOTE: We use an ImmutableList to avoid issues with invalidating iterators
-  // to the list while we are traversing it.
   for (SetOfDecls::iterator I = LocalTUDecls.begin(),
                             E = LocalTUDecls.end(); I != E; ++I)
     CG.addToCallGraph(*I);
@@ -410,12 +403,13 @@ void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
 
     // Process all the top level declarations.
     //
-    // NOTE: We use an ImmutableList to avoid issues with invalidating iterators
-    // to the list while we are traversing it.
-    //
-    for (SetOfDecls::iterator I = LocalTUDecls.begin(),
-         E = LocalTUDecls.end(); I != E; ++I) {
-      TraverseDecl(*I);
+    // Note: TraverseDecl may modify LocalTUDecls, but only by appending more
+    // entries.  Thus we don't use an iterator, but rely on LocalTUDecls
+    // random access.  By doing so, we automatically compensate for iterators
+    // possibly being invalidated, although this is a bit slower.
+    const unsigned n = LocalTUDecls.size();
+    for (unsigned i = 0 ; i < n ; ++i) {
+      TraverseDecl(LocalTUDecls[i]);
     }
 
     if (Mgr->shouldInlineCall())
index e4d5aaf82b2dc03426e2a4cd5774578c54a259e1..7cf2aee35fc01f8199abef45df9dd1ab00b073f7 100644 (file)
@@ -80,11 +80,11 @@ int handleVoidInComma() {
 int marker(void) { // control reaches end of non-void function
 }
 
+// CHECK-darwin8: warning: The receiver of message 'longDoubleM' is nil and returns a value of type 'long double' that will be garbage
 // CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
-// CHECK-darwin8: warning: The receiver of message 'unsignedLongLongM' is nil and returns a value of type 'unsigned long long' that will be garbage
 // CHECK-darwin8: warning: The receiver of message 'doubleM' is nil and returns a value of type 'double' that will be garbage
+// CHECK-darwin8: warning: The receiver of message 'unsignedLongLongM' is nil and returns a value of type 'unsigned long long' that will be garbage
 // CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
-// CHECK-darwin8: warning: The receiver of message 'longDoubleM' is nil and returns a value of type 'long double' that will be garbage
 
 // CHECK-darwin9-NOT: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
 // CHECK-darwin9-NOT: warning: The receiver of message 'unsignedLongLongM' is nil and returns a value of type 'unsigned long long' that will be garbage