summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-12-21 19:07:48 +0000
committerDouglas Gregor <dgregor@apple.com>2010-12-21 19:07:48 +0000
commitfd4da713435a470be221ae1b823b3cb8ef518a60 (patch)
tree03b19de191f68e4c9769fea079d6bb6d8888479e
parent2a7ff9997995a26d33603ac69ceb1ed66d701e5a (diff)
downloadbcm5719-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.h6
-rw-r--r--clang/test/Index/Inputs/get-cursor-includes-2.h2
-rw-r--r--clang/test/Index/get-cursor-includes.c7
-rw-r--r--clang/tools/libclang/CIndex.cpp15
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) {
OpenPOWER on IntegriCloud