Properly escape filenames in line directives.

Fixes PR17018.  Only partial test coverage because I don't want
to try to write a test which generates a file whose name contains a newline.

llvm-svn: 189557
This commit is contained in:
Eli Friedman 2013-08-29 01:42:42 +00:00
parent 9a83a76b1b
commit 80e45b8cd4
3 changed files with 8 additions and 4 deletions

View File

@ -190,11 +190,11 @@ void PrintPPOutputPPCallbacks::WriteLineInfo(unsigned LineNo,
// Emit #line directives or GNU line markers depending on what mode we're in.
if (UseLineDirective) {
OS << "#line" << ' ' << LineNo << ' ' << '"';
OS.write(CurFilename.data(), CurFilename.size());
OS.write_escaped(CurFilename);
OS << '"';
} else {
OS << '#' << ' ' << LineNo << ' ' << '"';
OS.write(CurFilename.data(), CurFilename.size());
OS.write_escaped(CurFilename);
OS << '"';
if (ExtraLen)
@ -285,7 +285,6 @@ void PrintPPOutputPPCallbacks::FileChanged(SourceLocation Loc,
CurFilename.clear();
CurFilename += UserLoc.getFilename();
Lexer::Stringify(CurFilename);
FileType = NewFileType;
if (DisableLineMarkers) {

View File

@ -114,7 +114,9 @@ void InclusionRewriter::WriteLineInfo(const char *Filename, int Line,
} else {
// Use GNU linemarkers as described here:
// http://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
OS << '#' << ' ' << Line << ' ' << '"' << Filename << '"';
OS << '#' << ' ' << Line << ' ' << '"';
OS.write_escaped(Filename);
OS << '"';
if (!Extra.empty())
OS << Extra;
if (FileType == SrcMgr::C_System)

View File

@ -73,3 +73,6 @@ extern int z;
# 42 "A.c"
# 44 "A.c"
# 49 "A.c"
// CHECK: # 50 "a\n.c"
# 50 "a\012.c"