diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-12-21 19:07:48 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-12-21 19:07:48 +0000 |
| commit | fd4da713435a470be221ae1b823b3cb8ef518a60 (patch) | |
| tree | 03b19de191f68e4c9769fea079d6bb6d8888479e | |
| parent | 2a7ff9997995a26d33603ac69ceb1ed66d701e5a (diff) | |
| download | bcm5719-llvm-fd4da713435a470be221ae1b823b3cb8ef518a60.tar.gz bcm5719-llvm-fd4da713435a470be221ae1b823b3cb8ef518a60.zip | |
When determining which preprocessed entities to traverse in libclang,
take into account the region of interest. Otherwise, we may fail to
traverse some important preprocessed entity cursors.
Fixes <rdar://problem/8554072>.
llvm-svn: 122350
| -rw-r--r-- | clang/test/Index/Inputs/get-cursor-includes-1.h | 6 | ||||
| -rw-r--r-- | clang/test/Index/Inputs/get-cursor-includes-2.h | 2 | ||||
| -rw-r--r-- | clang/test/Index/get-cursor-includes.c | 7 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 15 |
4 files changed, 29 insertions, 1 deletions
diff --git a/clang/test/Index/Inputs/get-cursor-includes-1.h b/clang/test/Index/Inputs/get-cursor-includes-1.h new file mode 100644 index 00000000000..48439d2ae26 --- /dev/null +++ b/clang/test/Index/Inputs/get-cursor-includes-1.h @@ -0,0 +1,6 @@ +#ifndef GET_CURSOR_INCLUDES_1_H +#define GET_CURSOR_INCLUDES_1_H + +extern int blah; + +#endif // GET_CURSOR_INCLUDES_1_H diff --git a/clang/test/Index/Inputs/get-cursor-includes-2.h b/clang/test/Index/Inputs/get-cursor-includes-2.h new file mode 100644 index 00000000000..cf95c1828be --- /dev/null +++ b/clang/test/Index/Inputs/get-cursor-includes-2.h @@ -0,0 +1,2 @@ +#include "get-cursor-includes-1.h" +#include "get-cursor-includes-1.h" diff --git a/clang/test/Index/get-cursor-includes.c b/clang/test/Index/get-cursor-includes.c new file mode 100644 index 00000000000..68d64f14467 --- /dev/null +++ b/clang/test/Index/get-cursor-includes.c @@ -0,0 +1,7 @@ +#include "get-cursor-includes-2.h" +#include "get-cursor-includes-2.h" + +// RUN: c-index-test -write-pch %t.h.pch -I%S/Inputs -Xclang -detailed-preprocessing-record %S/Inputs/get-cursor-includes-2.h +// RUN: c-index-test -cursor-at=%S/Inputs/get-cursor-includes-2.h:1:5 -I%S/Inputs -include %t.h %s | FileCheck %s + +// CHECK: inclusion directive=get-cursor-includes-1.h diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 38b58e0068e..bd39925dade 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -410,7 +410,20 @@ CursorVisitor::getPreprocessedEntities() { = *AU->getPreprocessor().getPreprocessingRecord(); bool OnlyLocalDecls - = !AU->isMainFileAST() && AU->getOnlyLocalDecls(); + = !AU->isMainFileAST() && AU->getOnlyLocalDecls(); + + if (OnlyLocalDecls && RegionOfInterest.isValid()) { + // If we would only look at local declarations but we have a region of + // interest, check whether that region of interest is in the main file. + // If not, we should traverse all declarations. + // FIXME: My kingdom for a proper binary search approach to finding + // cursors! + std::pair<FileID, unsigned> Location + = AU->getSourceManager().getDecomposedInstantiationLoc( + RegionOfInterest.getBegin()); + if (Location.first != AU->getSourceManager().getMainFileID()) + OnlyLocalDecls = false; + } PreprocessingRecord::iterator StartEntity, EndEntity; if (OnlyLocalDecls) { |

