summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-06-15 05:02:34 +0000
committerChris Lattner <sabre@nondot.org>2009-06-15 05:02:34 +0000
commitd9efb6ee52e0c1084494935c8c910aff70667064 (patch)
treed93380d4c4af5448a176801f11a0aa8093e38719 /clang/lib/Lex
parent2228a1ee613eae30b275159a0330191ff9ccb8ae (diff)
downloadbcm5719-llvm-d9efb6ee52e0c1084494935c8c910aff70667064.tar.gz
bcm5719-llvm-d9efb6ee52e0c1084494935c8c910aff70667064.zip
Fix #pragma GCC system_header by making it insert a virtual linemarker into
the file at the point of the pragma. This allows clang to know that all sourcelocations after the pragma are in a system header. llvm-svn: 73376
Diffstat (limited to 'clang/lib/Lex')
-rw-r--r--clang/lib/Lex/Pragma.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index ce5934134f4..9776c2cfbd9 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -195,8 +195,10 @@ void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
void Preprocessor::HandlePragmaMark() {
assert(CurPPLexer && "No current lexer?");
- if (CurLexer) CurLexer->ReadToEndOfLine();
- else CurPTHLexer->DiscardToEndOfLine();
+ if (CurLexer)
+ CurLexer->ReadToEndOfLine();
+ else
+ CurPTHLexer->DiscardToEndOfLine();
}
@@ -254,6 +256,18 @@ void Preprocessor::HandlePragmaSystemHeader(Token &SysHeaderTok) {
// Mark the file as a system header.
HeaderInfo.MarkFileSystemHeader(TheLexer->getFileEntry());
+
+ PresumedLoc PLoc = SourceMgr.getPresumedLoc(SysHeaderTok.getLocation());
+ unsigned FilenameLen = strlen(PLoc.getFilename());
+ unsigned FilenameID = SourceMgr.getLineTableFilenameID(PLoc.getFilename(),
+ FilenameLen);
+
+ // Emit a line marker. This will change any source locations from this point
+ // forward to realize they are in a system header.
+ // Create a line note with this information.
+ SourceMgr.AddLineNote(SysHeaderTok.getLocation(), PLoc.getLine(), FilenameID,
+ false, false, true, false);
+
// Notify the client, if desired, that we are in a new source file.
if (Callbacks)
Callbacks->FileChanged(SysHeaderTok.getLocation(),
OpenPOWER on IntegriCloud