From: Argyrios Kyrtzidis Date: Thu, 22 Dec 2011 04:38:07 +0000 (+0000) Subject: In Lexer::getCharAndSizeSlow[NoWarn] if we come up against X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=04a94bcc56438b17e88db592708324041f75d48c;p=clang In Lexer::getCharAndSizeSlow[NoWarn] if we come up against \ don't consume the second newline. Thanks to David Blaikie for pointing out the crash! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147138 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index acb5b8a797..d3a97b42b1 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -1172,8 +1172,11 @@ Slash: Size += EscapedNewLineSize; Ptr += EscapedNewLineSize; - if (Ptr[0] == '\0') - return '\\'; + // If the char that we finally got was a \n, then we must have had + // something like \. We don't want to consume the + // second newline. + if (*Ptr == '\n' || *Ptr == '\r' || *Ptr == '\0') + return ' '; // Use slow version to accumulate a correct size field. return getCharAndSizeSlow(Ptr, Size, Tok); @@ -1226,8 +1229,11 @@ Slash: Size += EscapedNewLineSize; Ptr += EscapedNewLineSize; - if (Ptr[0] == '\0') - return '\\'; + // If the char that we finally got was a \n, then we must have had + // something like \. We don't want to consume the + // second newline. + if (*Ptr == '\n' || *Ptr == '\r' || *Ptr == '\0') + return ' '; // Use slow version to accumulate a correct size field. return getCharAndSizeSlowNoWarn(Ptr, Size, Features); @@ -1696,14 +1702,6 @@ bool Lexer::SkipBCPLComment(Token &Result, const char *CurPtr) { break; } - // If the char that we finally got was a \n, then we must have had something - // like \. We don't want to have consumed the second - // newline, we want CurPtr, to end up pointing to it down below. - if (C == '\n' || C == '\r') { - --CurPtr; - C = 'x'; // doesn't matter what this is. - } - // If we read multiple characters, and one of those characters was a \r or // \n, then we had an escaped newline within the comment. Emit diagnostic // unless the next line is also a // comment. diff --git a/test/Lexer/escape_newline.c b/test/Lexer/escape_newline.c index 5e3002859c..d0f27dffdf 100644 --- a/test/Lexer/escape_newline.c +++ b/test/Lexer/escape_newline.c @@ -8,3 +8,4 @@ > // \ +