diff --git a/lib/Analysis/BasicObjCFoundationChecks.cpp b/lib/Analysis/BasicObjCFoundationChecks.cpp
index 717f5b8..958f85d 100644
--- a/lib/Analysis/BasicObjCFoundationChecks.cpp
+++ b/lib/Analysis/BasicObjCFoundationChecks.cpp
@@ -190,7 +190,7 @@
 void BasicObjCFoundationChecks::EmitWarnings(BugReporter& BR) {    
                  
   for (ErrorsTy::iterator I=Errors.begin(), E=Errors.end(); I!=E; ++I)    
-    BR.EmitPathWarning(**I);
+    BR.EmitWarning(**I);
 }
 
 bool BasicObjCFoundationChecks::CheckNilArg(NodeTy* N, unsigned Arg) {
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp
index d1689e2..294eb5f 100644
--- a/lib/Analysis/BugReporter.cpp
+++ b/lib/Analysis/BugReporter.cpp
@@ -142,8 +142,10 @@
 void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
                                          BugReport& R) {
 
-  ExplodedNode<ValueState>* N = R.getEndNode();  
-  assert (N && "Path diagnostic requires a ExplodedNode.");
+  ExplodedNode<ValueState>* N = R.getEndNode();
+
+  if (!N)
+    return;
   
   llvm::OwningPtr<ExplodedGraph<ValueState> > GTrim(getGraph().Trim(&N, &N+1));
 
@@ -371,55 +373,51 @@
   return false;
 }
 
-void BugReporter::EmitPathWarning(BugReport& R) {
-  
-  ExplodedNode<ValueState>* N = R.getEndNode();
-  
-  if (!PD || !N) {
-    EmitWarning(R);
+void BugReporter::EmitWarning(BugReport& R) {
+
+  if (IsCached(R.getEndNode()))
     return;
-  }
-  
-  if (IsCached(N))
-    return;
-  
+
   PathDiagnostic D(R.getName());  
   GeneratePathDiagnostic(D, R);
+
+  // Emit a full diagnostic for the path if we have a PathDiagnosticClient.
   
-  if (!D.empty())  
+  if (PD && !D.empty()) { 
     PD->HandlePathDiagnostic(D);
-}
-
-void BugReporter::EmitWarning(BugReport& R) {  
-
-  ExplodedNode<ValueState>* N = R.getEndNode();
+    return;    
+  }
   
-  if (N && IsCached(N))
-    return;
+  // We don't have a PathDiagnosticClient, but we can still emit a single
+  // line diagnostic.  Determine the location.
   
-  FullSourceLoc L = R.getLocation(Ctx.getSourceManager());
+  FullSourceLoc L = D.empty() ? R.getLocation(Ctx.getSourceManager())
+                               : D.back()->getLocation();
+  
+  
+  // Determine the range.
   
   const SourceRange *Beg, *End;
-  R.getRanges(Beg, End);
   
-  if (!PD) {
+  if (!D.empty()) {
+    Beg = D.back()->ranges_begin();
+    End = D.back()->ranges_end();
+  }
+  else  
+    R.getRanges(Beg, End);
+
+  // Compute the message.
   
-    std::ostringstream os;
-    os << "[CHECKER] " << R.getDescription();
-    
-    unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
-                                              os.str().c_str());
-    
-    Diag.Report(L, ErrorDiag, NULL, 0, Beg, End - Beg);    
-  }
-  else {    
-    PathDiagnostic D(R.getName());
-    PathDiagnosticPiece* piece = new PathDiagnosticPiece(L, R.getDescription());
-    
-    for ( ; Beg != End; ++Beg)
-      piece->addRange(*Beg);
-    
-    D.push_back(piece);    
-    PD->HandlePathDiagnostic(D);
-  }
+  std::ostringstream os;  
+  os << "[CHECKER] ";
+  
+  if (D.empty())
+    os << R.getDescription();
+  else
+    os << D.back()->getString();
+  
+  unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
+                                            os.str().c_str());
+      
+  Diag.Report(L, ErrorDiag, NULL, 0, Beg, End - Beg);    
 }
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index 0cfd577..fb11e4c 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -1281,7 +1281,7 @@
     
     RangedBugReport report(*this, I->first);
     report.addRange(I->second->getSourceRange());    
-    BR.EmitPathWarning(report);    
+    BR.EmitWarning(report);    
   }
 }
 
@@ -1292,7 +1292,7 @@
     
     RangedBugReport report(*this, I->first);
     report.addRange(I->second->getSourceRange());    
-    BR.EmitPathWarning(report); 
+    BR.EmitWarning(report); 
 
   }  
 }
@@ -1303,7 +1303,7 @@
        E = TF.leaks_end(); I != E; ++I) {
     
     BugReport report(*this, I->second);
-    BR.EmitPathWarning(report);     
+    BR.EmitWarning(report);     
   }  
 }
 
diff --git a/lib/Analysis/GRSimpleVals.cpp b/lib/Analysis/GRSimpleVals.cpp
index c8805ab..ea8762a 100644
--- a/lib/Analysis/GRSimpleVals.cpp
+++ b/lib/Analysis/GRSimpleVals.cpp
@@ -45,7 +45,7 @@
   
   for (; I != E; ++I) {
     BugReport R(D, GetNode(I));    
-    BR.EmitPathWarning(R);
+    BR.EmitWarning(R);
   }
 }
 
@@ -182,7 +182,7 @@
       report.addRange(I->second->getSourceRange());
 
       // Emit the warning.
-      BR.EmitPathWarning(report);
+      BR.EmitWarning(report);
     }
 
   }
@@ -209,7 +209,7 @@
       report.addRange(I->second->getSourceRange());
       
       // Emit the warning.
-      BR.EmitPathWarning(report);
+      BR.EmitWarning(report);
     }    
   }
 };
@@ -240,7 +240,7 @@
       report.addRange(E->getSourceRange());
       
       // Emit the warning.
-      BR.EmitPathWarning(report);
+      BR.EmitWarning(report);
     }    
   }
 };
