From 2d474ba9e8ae43a1a5a9f72718c0d79092b9453f Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 12 Aug 2010 17:04:55 +0000 Subject: [PATCH] Don't emit end-of-file diagnostics like "unterminated conditional" or "unterminated string" when we're performing code completion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110933 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/Lexer.cpp | 11 +++++++---- lib/Lex/PPDirectives.cpp | 5 +++-- lib/Lex/PTHLexer.cpp | 5 +++-- test/Index/complete-unterminated.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 test/Index/complete-unterminated.c diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index 7e6f7c1af6..9a96934d49 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -962,7 +962,8 @@ void Lexer::LexStringLiteral(Token &Result, const char *CurPtr, bool Wide) { if (C == '\n' || C == '\r' || // Newline. (C == 0 && CurPtr-1 == BufferEnd)) { // End of file. - if (!isLexingRawMode() && !Features.AsmPreprocessor) + if (!isLexingRawMode() && !Features.AsmPreprocessor && + !PP->isCodeCompletionFile(FileLoc)) Diag(BufferPtr, diag::err_unterminated_string); FormTokenWithChars(Result, CurPtr-1, tok::unknown); return; @@ -1039,7 +1040,8 @@ void Lexer::LexCharConstant(Token &Result, const char *CurPtr) { C = getAndAdvanceChar(CurPtr, Result); } else if (C == '\n' || C == '\r' || // Newline. (C == 0 && CurPtr-1 == BufferEnd)) { // End of file. - if (!isLexingRawMode() && !Features.AsmPreprocessor) + if (!isLexingRawMode() && !Features.AsmPreprocessor && + !PP->isCodeCompletionFile(FileLoc)) Diag(BufferPtr, diag::err_unterminated_char); FormTokenWithChars(Result, CurPtr-1, tok::unknown); return; @@ -1564,8 +1566,9 @@ bool Lexer::LexEndOfFile(Token &Result, const char *CurPtr) { // If we are in a #if directive, emit an error. while (!ConditionalStack.empty()) { - PP->Diag(ConditionalStack.back().IfLoc, - diag::err_pp_unterminated_conditional); + if (!PP->isCodeCompletionFile(FileLoc)) + PP->Diag(ConditionalStack.back().IfLoc, + diag::err_pp_unterminated_conditional); ConditionalStack.pop_back(); } diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 61ebf23acb..9cab2d2bfc 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -171,8 +171,9 @@ void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc, // Emit errors for each unterminated conditional on the stack, including // the current one. while (!CurPPLexer->ConditionalStack.empty()) { - Diag(CurPPLexer->ConditionalStack.back().IfLoc, - diag::err_pp_unterminated_conditional); + if (!isCodeCompletionFile(Tok.getLocation())) + Diag(CurPPLexer->ConditionalStack.back().IfLoc, + diag::err_pp_unterminated_conditional); CurPPLexer->ConditionalStack.pop_back(); } diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index 60b6e04526..63b4823cf1 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -146,8 +146,9 @@ bool PTHLexer::LexEndOfFile(Token &Result) { // If we are in a #if directive, emit an error. while (!ConditionalStack.empty()) { - PP->Diag(ConditionalStack.back().IfLoc, - diag::err_pp_unterminated_conditional); + if (!PP->isCodeCompletionFile(FileStartLoc)) + PP->Diag(ConditionalStack.back().IfLoc, + diag::err_pp_unterminated_conditional); ConditionalStack.pop_back(); } diff --git a/test/Index/complete-unterminated.c b/test/Index/complete-unterminated.c new file mode 100644 index 0000000000..56e6ae1378 --- /dev/null +++ b/test/Index/complete-unterminated.c @@ -0,0 +1,30 @@ +typedef int Integer; + +#if 0 + + +#endif + +/* blah */ + +void f0(const char*); +void f1(char); + +const char *hello = "Hello, world"; +const char a = 'a'; + +#define FOO(a, b) a b + +FOO(int, x); + +// RUN: c-index-test -code-completion-at=%s:5:1 -pedantic %s 2> %t.err | FileCheck %s +// RUN: not grep error %t.err +// CHECK: {TypedText Integer} +// RUN: c-index-test -code-completion-at=%s:8:6 -pedantic %s 2> %t.err +// RUN: not grep error %t.err +// RUN: c-index-test -code-completion-at=%s:10:28 -pedantic %s 2> %t.err +// RUN: not grep unterminated %t.err +// RUN: c-index-test -code-completion-at=%s:11:17 -pedantic %s 2> %t.err +// RUN: not grep unterminated %t.err +// RUN: c-index-test -code-completion-at=%s:18:10 -pedantic %s 2> %t.err +// RUN: not grep unterminated %t.err -- 2.40.0