Improve our handling of NULL after an escaping '\' in a string

literal. Fixes <rdar://problem/8044135>.

llvm-svn: 105181
This commit is contained in:
Douglas Gregor 2010-05-30 22:59:50 +00:00
parent 50d612d6c6
commit fe4a4107d8
2 changed files with 12 additions and 2 deletions

View File

@ -753,11 +753,15 @@ void Lexer::LexStringLiteral(Token &Result, const char *CurPtr, bool Wide) {
char C = getAndAdvanceChar(CurPtr, Result);
while (C != '"') {
// Skip escaped characters.
bool Escaped = false;
if (C == '\\') {
// Skip the escaped character.
C = getAndAdvanceChar(CurPtr, Result);
} else if (C == '\n' || C == '\r' || // Newline.
(C == 0 && CurPtr-1 == BufferEnd)) { // End of file.
Escaped = true;
}
if ((!Escaped && (C == '\n' || C == '\r')) || // Newline.
(C == 0 && CurPtr-1 == BufferEnd)) { // End of file.
if (!isLexingRawMode() && !Features.AsmPreprocessor)
Diag(BufferPtr, diag::err_unterminated_string);
FormTokenWithChars(Result, CurPtr-1, tok::unknown);
@ -765,6 +769,7 @@ void Lexer::LexStringLiteral(Token &Result, const char *CurPtr, bool Wide) {
} else if (C == 0) {
NulCharacter = CurPtr-1;
}
C = getAndAdvanceChar(CurPtr, Result);
}

View File

@ -10,6 +10,8 @@ int test(int i, int j, int k, int l) {
struct X f1 = { 17 };
void f2() { f1(17); }
const char *str = "Hello, \nWorld";
// RUN: c-index-test -code-completion-at=%s:7:9 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
// CHECK-CC1: macro definition:{TypedText __VERSION__} (70)
// CHECK-CC1: FunctionDecl:{ResultType int}{TypedText f}{LeftParen (}{Placeholder int}{RightParen )} (12)
@ -35,3 +37,6 @@ void f2() { f1(17); }
// CHECK-CC4: FunctionDecl:{ResultType int}{TypedText f}{LeftParen (}{Placeholder int}{RightParen )} (50)
// CHECK-CC4: VarDecl:{ResultType struct X}{TypedText f1} (50)
// RUN: c-index-test -code-completion-at=%s:13:28 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC5 %s
// CHECK-CC5: NotImplemented:{TypedText void} (40)
// CHECK-CC5: NotImplemented:{TypedText volatile} (40)