From: Chris Lattner Date: Mon, 15 Jun 2009 05:02:34 +0000 (+0000) Subject: Fix #pragma GCC system_header by making it insert a virtual linemarker into X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6896a371e302c63ce3d4a99ad2c32e42dde6a9e4;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73376 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp index ce5934134f..9776c2cfbd 100644 --- a/lib/Lex/Pragma.cpp +++ b/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(), diff --git a/test/Preprocessor/pragma_sysheader.c b/test/Preprocessor/pragma_sysheader.c new file mode 100644 index 0000000000..49082b8c09 --- /dev/null +++ b/test/Preprocessor/pragma_sysheader.c @@ -0,0 +1,3 @@ +// RUN: clang -verify -pedantic %s -fsyntax-only +// rdar://6899937 +#include "pragma_sysheader.h" diff --git a/test/Preprocessor/pragma_sysheader.h b/test/Preprocessor/pragma_sysheader.h new file mode 100644 index 0000000000..b79bde584a --- /dev/null +++ b/test/Preprocessor/pragma_sysheader.h @@ -0,0 +1,4 @@ +#pragma GCC system_header +typedef int x; +typedef int x; +