aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/PreprocessingRecord.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-09-22 21:17:02 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-09-22 21:17:02 +0000
commit4cd06348a8c7b3559e9f437439dfc75ff7a04e88 (patch)
tree622d1a7c8ccf91e101f527f5beb060787ec44a19 /lib/Lex/PreprocessingRecord.cpp
parent8990daf237a48fa2eed3d0546687fc097a004db6 (diff)
Do manual binary search for preprocessing entities because their end locations
may be unordered and MSVC's debug-mode doesn't like it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140337 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/PreprocessingRecord.cpp')
-rw-r--r--lib/Lex/PreprocessingRecord.cpp28
1 files changed, 23 insertions, 5 deletions
diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp
index 438eba00ba..0f5577520d 100644
--- a/lib/Lex/PreprocessingRecord.cpp
+++ b/lib/Lex/PreprocessingRecord.cpp
@@ -129,12 +129,30 @@ unsigned PreprocessingRecord::findBeginLocalPreprocessedEntity(
if (SourceMgr.isLoadedSourceLocation(Loc))
return 0;
+ size_t Count = PreprocessedEntities.size();
+ size_t Half;
std::vector<PreprocessedEntity *>::const_iterator
- I = std::lower_bound(PreprocessedEntities.begin(),
- PreprocessedEntities.end(),
- Loc,
- PPEntityComp<&SourceRange::getEnd>(SourceMgr));
- return I - PreprocessedEntities.begin();
+ First = PreprocessedEntities.begin();
+ std::vector<PreprocessedEntity *>::const_iterator I;
+
+ // Do a binary search manually instead of using std::lower_bound because
+ // The end locations of entities may be unordered (when a macro expansion
+ // is inside another macro argument), but for this case it is not important
+ // whether we get the first macro expansion or its containing macro.
+ while (Count > 0) {
+ Half = Count/2;
+ I = First;
+ std::advance(I, Half);
+ if (SourceMgr.isBeforeInTranslationUnit((*I)->getSourceRange().getEnd(),
+ Loc)){
+ First = I;
+ ++First;
+ Count = Count - Half - 1;
+ } else
+ Count = Half;
+ }
+
+ return First - PreprocessedEntities.begin();
}
unsigned PreprocessingRecord::findEndLocalPreprocessedEntity(