add a new SourceManager::getInstantiationRange helper method.

llvm-svn: 64606
This commit is contained in:
Chris Lattner 2009-02-15 21:26:50 +00:00
parent 641f1eab77
commit f52c0b261c
3 changed files with 27 additions and 5 deletions

View File

@ -425,8 +425,8 @@ public:
return SourceLocation::getFileLoc(FileOffset);
}
/// Given a SourceLocation object, return the instantiation location
/// referenced by the ID.
/// getInstantiationLoc - Given a SourceLocation object, return the
/// instantiation location referenced by the ID.
SourceLocation getInstantiationLoc(SourceLocation Loc) const {
// Handle the non-mapped case inline, defer to out of line code to handle
// instantiations.
@ -439,6 +439,12 @@ public:
std::pair<SourceLocation,SourceLocation>
getImmediateInstantiationRange(SourceLocation Loc) const;
/// getInstantiationRange - Given a SourceLocation object, return the
/// range of tokens covered by the instantiation in the ultimate file.
std::pair<SourceLocation,SourceLocation>
getInstantiationRange(SourceLocation Loc) const;
/// getSpellingLoc - Given a SourceLocation object, return the spelling
/// location referenced by the ID. This is the place where the characters
/// that make up the lexed token can be found.

View File

@ -606,6 +606,24 @@ SourceManager::getImmediateInstantiationRange(SourceLocation Loc) const {
return II.getInstantiationLocRange();
}
/// getInstantiationRange - Given a SourceLocation object, return the
/// range of tokens covered by the instantiation in the ultimate file.
std::pair<SourceLocation,SourceLocation>
SourceManager::getInstantiationRange(SourceLocation Loc) const {
if (Loc.isFileID()) return std::make_pair(Loc, Loc);
std::pair<SourceLocation,SourceLocation> Res =
getImmediateInstantiationRange(Loc);
// Fully resolve the start and end locations to their ultimate instantiation
// points.
while (!Res.first.isFileID())
Res.first = getImmediateInstantiationRange(Res.first).first;
while (!Res.second.isFileID())
Res.second = getImmediateInstantiationRange(Res.second).second;
return Res;
}
//===----------------------------------------------------------------------===//

View File

@ -471,9 +471,7 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) {
// can matter for a function-like macro that expands to contain __LINE__.
// Skip down through instantiation points until we find a file loc for the
// end of the instantiation history.
while (!Loc.isFileID())
Loc = SourceMgr.getImmediateInstantiationRange(Loc).second;
Loc = SourceMgr.getInstantiationRange(Loc).second;
PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
// __LINE__ expands to a simple numeric value. Add a space after it so that