[libclang] When doing clang_findReferencesInFile, make sure we don't crash

if we come up against a null Decl.

No test case unfortunately. rdar://10457799.

llvm-svn: 146127
This commit is contained in:
Argyrios Kyrtzidis 2011-12-08 01:56:07 +00:00
parent 161f367047
commit 831411f42b
1 changed files with 15 additions and 3 deletions

View File

@ -73,17 +73,26 @@ struct FindFileIdRefVisitData {
/// we consider the canonical decl of the constructor decl to be the class
/// itself, so both 'C' can be highlighted.
Decl *getCanonical(Decl *D) const {
if (!D)
return 0;
D = D->getCanonicalDecl();
if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
return getCanonical(ImplD->getClassInterface());
if (CXXConstructorDecl *CXXCtorD = dyn_cast<CXXConstructorDecl>(D))
if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) {
if (ImplD->getClassInterface())
return getCanonical(ImplD->getClassInterface());
} else if (CXXConstructorDecl *CXXCtorD = dyn_cast<CXXConstructorDecl>(D)) {
return getCanonical(CXXCtorD->getParent());
}
return D;
}
bool isHit(Decl *D) const {
if (!D)
return false;
D = getCanonical(D);
if (D == Dcl)
return true;
@ -203,6 +212,9 @@ static void findIdRefsInFile(CXTranslationUnit TU, CXCursor declCursor,
FileID FID = SM.translateFile(File);
Decl *Dcl = cxcursor::getCursorDecl(declCursor);
if (!Dcl)
return;
FindFileIdRefVisitData data(TU, FID, Dcl,
cxcursor::getSelectorIdentifierIndex(declCursor),
Visitor);