diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-05 00:22:28 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-05 00:22:28 +0000 |
commit | f03b888a12ccff7d54ddd8a79a0141cf23adbf67 (patch) | |
tree | 7c5774130f8530872ed12d573f8ce466725327dc /include/clang | |
parent | 6a01012e6bffa246810dc5c655a9a30082331fb2 (diff) |
[preprocessing record] Have PPEntityID be independent of the size of the
loaded entities vector, otherwise its meaning will change when a module
is imported and the vector size changes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165278 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang')
-rw-r--r-- | include/clang/Lex/PreprocessingRecord.h | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index a569575aa3..f0cbc63df3 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -352,14 +352,21 @@ namespace clang { /// Negative values are used to indicate preprocessed entities /// loaded from the external source while non-negative values are used to /// indicate preprocessed entities introduced by the current preprocessor. - /// If M is the number of loaded preprocessed entities, value -M - /// corresponds to element 0 in the loaded entities vector, position -M+1 - /// corresponds to element 1 in the loaded entities vector, etc. - typedef int PPEntityID; - - PPEntityID getPPEntityID(unsigned Index, bool isLoaded) const { - return isLoaded ? PPEntityID(Index) - LoadedPreprocessedEntities.size() - : Index; + /// Value -1 corresponds to element 0 in the loaded entities vector, + /// value -2 corresponds to element 1 in the loaded entities vector, etc. + /// Value 0 is an invalid value, the index to local entities is 1-based, + /// value 1 corresponds to element 0 in the local entities vector, + /// value 2 corresponds to element 1 in the local entities vector, etc. + class PPEntityID { + int ID; + explicit PPEntityID(int ID) : ID(ID) {} + friend class PreprocessingRecord; + public: + PPEntityID() : ID(0) {} + }; + + static PPEntityID getPPEntityID(unsigned Index, bool isLoaded) { + return isLoaded ? PPEntityID(-int(Index)-1) : PPEntityID(Index+1); } /// \brief Mapping from MacroInfo structures to their definitions. @@ -428,7 +435,7 @@ namespace clang { /// corresponds to element 0 in the loaded entities vector, position -M+1 /// corresponds to element 1 in the loaded entities vector, etc. This /// gives us a reasonably efficient, source-order walk. - PPEntityID Position; + int Position; public: typedef PreprocessedEntity *value_type; @@ -439,11 +446,15 @@ namespace clang { iterator() : Self(0), Position(0) { } - iterator(PreprocessingRecord *Self, PPEntityID Position) + iterator(PreprocessingRecord *Self, int Position) : Self(Self), Position(Position) { } value_type operator*() const { - return Self->getPreprocessedEntity(Position); + bool isLoaded = Position < 0; + unsigned Index = isLoaded ? + Self->LoadedPreprocessedEntities.size() + Position : Position; + PPEntityID ID = Self->getPPEntityID(Index, isLoaded); + return Self->getPreprocessedEntity(ID); } value_type operator[](difference_type D) { @@ -634,11 +645,10 @@ namespace clang { /// query. struct { SourceRange Range; - std::pair<PPEntityID, PPEntityID> Result; + std::pair<int, int> Result; } CachedRangeQuery; - std::pair<PPEntityID, PPEntityID> - getPreprocessedEntitiesInRangeSlow(SourceRange R); + std::pair<int, int> getPreprocessedEntitiesInRangeSlow(SourceRange R); friend class ASTReader; friend class ASTWriter; |