aboutsummaryrefslogtreecommitdiff
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
commit32038bb8486a1f31e8bd8e19ef388049669e9ed2 (patch)
treee1dcb49741a62a51d203767635aad12096b4d75c
parent52e64c88133c6c3153208f216d53112db5c09e8b (diff)
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>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122350 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/Index/Inputs/get-cursor-includes-1.h6
-rw-r--r--test/Index/Inputs/get-cursor-includes-2.h2
-rw-r--r--test/Index/get-cursor-includes.c7
-rw-r--r--tools/libclang/CIndex.cpp15
4 files changed, 29 insertions, 1 deletions
diff --git a/test/Index/Inputs/get-cursor-includes-1.h b/test/Index/Inputs/get-cursor-includes-1.h
new file mode 100644
index 0000000000..48439d2ae2
--- /dev/null
+++ b/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/test/Index/Inputs/get-cursor-includes-2.h b/test/Index/Inputs/get-cursor-includes-2.h
new file mode 100644
index 0000000000..cf95c1828b
--- /dev/null
+++ b/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/test/Index/get-cursor-includes.c b/test/Index/get-cursor-includes.c
new file mode 100644
index 0000000000..68d64f1446
--- /dev/null
+++ b/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/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 38b58e0068..bd39925dad 100644
--- a/tools/libclang/CIndex.cpp
+++ b/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) {