diff options
author | Chris Lattner <sabre@nondot.org> | 2009-06-15 05:02:34 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-06-15 05:02:34 +0000 |
commit | d9efb6ee52e0c1084494935c8c910aff70667064 (patch) | |
tree | d93380d4c4af5448a176801f11a0aa8093e38719 /clang/lib/Lex | |
parent | 2228a1ee613eae30b275159a0330191ff9ccb8ae (diff) | |
download | bcm5719-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.cpp | 18 |
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(), |