From: Argyrios Kyrtzidis Date: Thu, 8 Dec 2011 01:56:07 +0000 (+0000) Subject: [libclang] When doing clang_findReferencesInFile, make sure we don't crash X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e368a641a03617983dabb1e092d880e1089f576a;p=clang [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146127 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndexHigh.cpp b/tools/libclang/CIndexHigh.cpp index a4f85b4c12..bbb6d6dcad 100644 --- a/tools/libclang/CIndexHigh.cpp +++ b/tools/libclang/CIndexHigh.cpp @@ -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(D)) - return getCanonical(ImplD->getClassInterface()); - if (CXXConstructorDecl *CXXCtorD = dyn_cast(D)) + if (ObjCImplDecl *ImplD = dyn_cast(D)) { + if (ImplD->getClassInterface()) + return getCanonical(ImplD->getClassInterface()); + + } else if (CXXConstructorDecl *CXXCtorD = dyn_cast(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);