[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:
parent
161f367047
commit
831411f42b
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue