diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/CIndex/CIndex.cpp | 16 | ||||
-rw-r--r-- | tools/c-index-test/c-index-test.c | 4 |
2 files changed, 17 insertions, 3 deletions
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 133a269afd..d0638d0772 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -22,11 +22,12 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Frontend/ASTUnit.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/System/Path.h" #include <cstdio> #include <dlfcn.h> #include <sys/wait.h> #include <vector> -#include "llvm/System/Path.h" using namespace clang; using namespace idx; @@ -823,7 +824,18 @@ const char *clang_getCursorSource(CXCursor C) SourceManager &SourceMgr = ND->getASTContext().getSourceManager(); SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND); - return SourceMgr.getBufferName(SLoc); + if (SLoc.isFileID()) + return SourceMgr.getBufferName(SLoc); + + // Retrieve the file in which the macro was instantiated, then provide that + // buffer name. + // FIXME: Do we want to give specific macro-instantiation information? + const llvm::MemoryBuffer *Buffer + = SourceMgr.getBuffer(SourceMgr.getDecomposedSpellingLoc(SLoc).first); + if (!Buffer) + return 0; + + return Buffer->getBufferIdentifier(); } void clang_getDefinitionSpellingAndExtent(CXCursor C, diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index bfc8e620ac..73764950c3 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -63,7 +63,9 @@ static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor, Ref = clang_getCursor(Unit, clang_getCursorSource(Cursor), curLine, curColumn); - if (Ref.kind != CXCursor_FunctionDecl) { + if (Ref.kind == CXCursor_NoDeclFound) { + // Nothing found here; that's fine. + } else if (Ref.kind != CXCursor_FunctionDecl) { printf("// CHECK: %s:%d:%d: ", basename(clang_getCursorSource(Ref)), curLine, curColumn); PrintCursor(Ref); |