mirror of
https://github.com/intel/llvm.git
synced 2026-02-03 10:39:35 +08:00
Fix crash on end-of-file after \ in a char literal, fixes PR14369.
This makes LexCharConstant() look more like LexStringLiteral(), which doesn't have this bug. Add tests for eof after \ for several other cases. llvm-svn: 168269
This commit is contained in:
@@ -1823,16 +1823,18 @@ void Lexer::LexCharConstant(Token &Result, const char *CurPtr,
|
||||
|
||||
while (C != '\'') {
|
||||
// Skip escaped characters.
|
||||
if (C == '\\') {
|
||||
// Skip the escaped character.
|
||||
getAndAdvanceChar(CurPtr, Result);
|
||||
} else if (C == '\n' || C == '\r' || // Newline.
|
||||
(C == 0 && CurPtr-1 == BufferEnd)) { // End of file.
|
||||
if (C == '\\')
|
||||
C = getAndAdvanceChar(CurPtr, Result);
|
||||
|
||||
if (C == '\n' || C == '\r' || // Newline.
|
||||
(C == 0 && CurPtr-1 == BufferEnd)) { // End of file.
|
||||
if (!isLexingRawMode() && !LangOpts.AsmPreprocessor)
|
||||
Diag(BufferPtr, diag::ext_unterminated_char);
|
||||
FormTokenWithChars(Result, CurPtr-1, tok::unknown);
|
||||
return;
|
||||
} else if (C == 0) {
|
||||
}
|
||||
|
||||
if (C == 0) {
|
||||
if (isCodeCompletionPoint(CurPtr-1)) {
|
||||
PP->CodeCompleteNaturalLanguage();
|
||||
FormTokenWithChars(Result, CurPtr-1, tok::unknown);
|
||||
|
||||
8
clang/test/Lexer/eof-char.c
Normal file
8
clang/test/Lexer/eof-char.c
Normal file
@@ -0,0 +1,8 @@
|
||||
// RUN: %clang_cc1 %s -verify -fsyntax-only
|
||||
// vim: set binary noeol:
|
||||
|
||||
// This file intentionally ends without a \n on the last line. Make sure your
|
||||
// editor doesn't add one.
|
||||
|
||||
// expected-warning@+1{{missing terminating ' character}} expected-error@+1{{expected expression}} expected-error@+1{{expected ';'}}
|
||||
char c = '\
|
||||
8
clang/test/Lexer/eof-file.c
Normal file
8
clang/test/Lexer/eof-file.c
Normal file
@@ -0,0 +1,8 @@
|
||||
// RUN: %clang_cc1 %s -verify -fsyntax-only
|
||||
// vim: set binary noeol:
|
||||
|
||||
// This file intentionally ends without a \n on the last line. Make sure your
|
||||
// editor doesn't add one.
|
||||
|
||||
// expected-error@+1{{expected expression}} expected-error@+1{{expected ';'}}
|
||||
char c = \
|
||||
8
clang/test/Lexer/eof-string.c
Normal file
8
clang/test/Lexer/eof-string.c
Normal file
@@ -0,0 +1,8 @@
|
||||
// RUN: %clang_cc1 %s -verify -fsyntax-only
|
||||
// vim: set binary noeol:
|
||||
|
||||
// This file intentionally ends without a \n on the last line. Make sure your
|
||||
// editor doesn't add one.
|
||||
|
||||
// expected-warning@+1{{missing terminating '"' character}} expected-error@+1{{expected expression}} expected-error@+1{{expected ';'}}
|
||||
char c = "\
|
||||
Reference in New Issue
Block a user