From 144b6c0c50b5523609cbac523f168b9e3cb01175 Mon Sep 17 00:00:00 2001
From: Argyrios Kyrtzidis <akyrtzi@gmail.com>
Date: Fri, 18 Nov 2011 00:26:46 +0000
Subject: [PATCH] [libclang] Indexing API: make sure we don't pass
 declarations/references without USR or location.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144941 91177308-0d34-0410-b5e6-96231b3b80d8
---
 tools/libclang/IndexingContext.cpp | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp
index 890336e3ac0..f63fd3f103f 100644
--- a/tools/libclang/IndexingContext.cpp
+++ b/tools/libclang/IndexingContext.cpp
@@ -105,11 +105,14 @@ void IndexingContext::handleDiagnostic(CXDiagnostic CXDiag) {
 void IndexingContext::handleDecl(const NamedDecl *D,
                                  SourceLocation Loc, CXCursor Cursor,
                                  DeclInfo &DInfo) {
-  if (!CB.indexDeclaration)
+  if (!CB.indexDeclaration || !D)
     return;
 
   StrAdapter SA(*this);
   getEntityInfo(D, DInfo.CXEntInfo, SA);
+  if (!DInfo.CXEntInfo.USR || Loc.isInvalid())
+    return;
+
   DInfo.entityInfo = &DInfo.CXEntInfo;
   DInfo.cursor = Cursor;
   DInfo.loc = getIndexLoc(Loc);
@@ -307,6 +310,14 @@ void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
 
   D = getEntityDecl(D);
 
+  StrAdapter SA(*this);
+  CXIdxEntityInfo RefEntity, ParentEntity;
+  getEntityInfo(D, RefEntity, SA);
+  if (!RefEntity.USR)
+    return;
+
+  getEntityInfo(Parent, ParentEntity, SA);
+
   if (onlyOneRefPerFile()) {
     SourceManager &SM = Ctx->getSourceManager();
     SourceLocation FileLoc = SM.getFileLoc(Loc);
@@ -326,14 +337,9 @@ void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
       return; // already in map.
   }
 
-  StrAdapter SA(*this);
   CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E),
                                      const_cast<Decl*>(cast<Decl>(DC)), CXTU)
                       : getRefCursor(D, Loc);
-
-  CXIdxEntityInfo RefEntity, ParentEntity;
-  getEntityInfo(D, RefEntity, SA);
-  getEntityInfo(Parent, ParentEntity, SA);
   CXIdxEntityRefInfo Info = { Cursor,
                               getIndexLoc(Loc),
                               &RefEntity,
@@ -543,7 +549,7 @@ void IndexingContext::getEntityInfo(const NamedDecl *D,
     unsigned Begin = SA.getCurSize();
     bool Ignore = getDeclCursorUSR(D, SA.getBuffer());
     if (Ignore) {
-      EntityInfo.USR = "";
+      EntityInfo.USR = 0;
     } else {
       EntityInfo.USR = SA.getCStr(Begin);
     }
-- 
GitLab