[cfe-commits] r68470 - in /cfe/trunk: include/clang/Analysis/PathDiagnostic.h lib/Analysis/PathDiagnostic.cpp

Ted Kremenek kremenek at apple.com
Mon Apr 6 15:33:36 PDT 2009


Author: kremenek
Date: Mon Apr  6 17:33:35 2009
New Revision: 68470

URL: http://llvm.org/viewvc/llvm-project?rev=68470&view=rev
Log:
PathDiagnosticLocation now also wraps Decls.

Modified:
    cfe/trunk/include/clang/Analysis/PathDiagnostic.h
    cfe/trunk/lib/Analysis/PathDiagnostic.cpp

Modified: cfe/trunk/include/clang/Analysis/PathDiagnostic.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathDiagnostic.h?rev=68470&r1=68469&r2=68470&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathDiagnostic.h (original)
+++ cfe/trunk/include/clang/Analysis/PathDiagnostic.h Mon Apr  6 17:33:35 2009
@@ -31,6 +31,7 @@
 
 class PathDiagnostic;
 class Stmt;
+class Decl;
 
 class PathDiagnosticClient : public DiagnosticClient  {
 public:
@@ -54,35 +55,40 @@
   
 class PathDiagnosticLocation {
 private:
-  enum Kind { Range, SingleLoc, Statement } K;
+  enum Kind { RangeK, SingleLocK, StmtK, DeclK } K;
   SourceRange R;
   const Stmt *S;
+  const Decl *D;
   const SourceManager *SM;
 public:
   PathDiagnosticLocation()
-    : K(SingleLoc), S(0), SM(0) {}
+    : K(SingleLocK), S(0), D(0), SM(0) {}
   
   PathDiagnosticLocation(FullSourceLoc L)
-    : K(SingleLoc), R(L, L), S(0), SM(&L.getManager()) {}
+    : K(SingleLocK), R(L, L), S(0), D(0), SM(&L.getManager()) {}
   
   PathDiagnosticLocation(const Stmt *s, const SourceManager &sm)
-    : K(Statement), S(s), SM(&sm) {}
+    : K(StmtK), S(s), D(0), SM(&sm) {}
   
   PathDiagnosticLocation(SourceRange r, const SourceManager &sm)
-    : K(Range), R(r), S(0), SM(&sm) {}
+    : K(RangeK), R(r), S(0), D(0), SM(&sm) {}
+  
+  PathDiagnosticLocation(const Decl *d, const SourceManager &sm)
+    : K(DeclK), S(0), D(d), SM(&sm) {}
   
   bool operator==(const PathDiagnosticLocation &X) const {
-    return K == X.K && R == X.R && S == X.S;
+    return K == X.K && R == X.R && S == X.S && D == X.D;
   }
   
   bool operator!=(const PathDiagnosticLocation &X) const {
-    return K != X.K || R != X.R || S != X.S;
+    return K != X.K || R != X.R || S != X.S || D != X.D;;
   }
   
   PathDiagnosticLocation& operator=(const PathDiagnosticLocation &X) {
     K = X.K;
     R = X.R;
     S = X.S;
+    D = X.D;
     SM = X.SM;
     return *this;
   }
@@ -94,20 +100,15 @@
   FullSourceLoc asLocation() const;
   SourceRange asRange() const;
   const Stmt *asStmt() const { assert(isValid()); return S; }
+  const Decl *asDecl() const { assert(isValid()); return D; }
   
-  bool hasRange() const { return K == Statement || K == Range; }
+  bool hasRange() const { return K == StmtK || K == RangeK || K == DeclK; }
   
   void invalidate() {
     *this = PathDiagnosticLocation();
   }
   
-  void flatten() {
-    if (K == Statement) {
-      R = asRange();
-      K = Range;
-      S = 0;
-    }    
-  }
+  void flatten();
   
   const SourceManager& getManager() const { assert(isValid()); return *SM; }
 };

Modified: cfe/trunk/lib/Analysis/PathDiagnostic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PathDiagnostic.cpp?rev=68470&r1=68469&r2=68470&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/PathDiagnostic.cpp (original)
+++ cfe/trunk/lib/Analysis/PathDiagnostic.cpp Mon Apr  6 17:33:35 2009
@@ -13,6 +13,8 @@
 
 #include "clang/Analysis/PathDiagnostic.h"
 #include "clang/AST/Expr.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclObjC.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/Support/Casting.h"
 #include <sstream>
@@ -144,11 +146,13 @@
   // Note that we want a 'switch' here so that the compiler can warn us in
   // case we add more cases.
   switch (K) {
-    case SingleLoc:
-    case Range:
+    case SingleLocK:
+    case RangeK:
       break;
-    case Statement:
+    case StmtK:
       return FullSourceLoc(S->getLocStart(), const_cast<SourceManager&>(*SM));
+    case DeclK:
+      return FullSourceLoc(D->getLocation(), const_cast<SourceManager&>(*SM));
   }
   
   return FullSourceLoc(R.getBegin(), const_cast<SourceManager&>(*SM));
@@ -159,13 +163,39 @@
   // Note that we want a 'switch' here so that the compiler can warn us in
   // case we add more cases.
   switch (K) {
-    case SingleLoc:
-    case Range:
+    case SingleLocK:
+    case RangeK:
       break;
-    case Statement:
+    case StmtK:
       return S->getSourceRange();
+    case DeclK:
+      if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
+        return MD->getSourceRange();
+      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
+        return FD->getBody()->getSourceRange();
+      else {
+        SourceLocation L = D->getLocation();
+        return SourceRange(L, L);
+      }
   }
   
   return R;
 }
 
+void PathDiagnosticLocation::flatten() {
+  if (K == StmtK) {
+    R = asRange();
+    K = RangeK;
+    S = 0;
+    D = 0;
+  }
+  else if (K == DeclK) {
+    SourceLocation L = D->getLocation();
+    R = SourceRange(L, L);
+    K = SingleLocK;
+    S = 0;
+    D = 0;
+  }
+}
+
+





More information about the cfe-commits mailing list