r323008 - [Lex] Fix crash on code completion in comment in included file.
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 24 07:31:21 PST 2018
On Wed, Jan 24, 2018 at 4:30 PM, Hans Wennborg <hans at chromium.org> wrote:
> Merged to 6.0 in r323333 as requested in PR36043. Richard, please
> complain if you don't agree.
Actually cc'ing Richard this time.
>
> On Sat, Jan 20, 2018 at 12:41 AM, Volodymyr Sapsai via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> Author: vsapsai
>> Date: Fri Jan 19 15:41:47 2018
>> New Revision: 323008
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=323008&view=rev
>> Log:
>> [Lex] Fix crash on code completion in comment in included file.
>>
>> This fixes PR32732 by updating CurLexerKind to reflect available lexers.
>> We were hitting null pointer in Preprocessor::Lex because CurLexerKind
>> was CLK_Lexer but CurLexer was null. And we set it to null in
>> Preprocessor::HandleEndOfFile when exiting a file with code completion
>> point.
>>
>> To reproduce the crash it is important for a comment to be inside a
>> class specifier. In this case in Parser::ParseClassSpecifier we improve
>> error recovery by pushing a semicolon token back into the preprocessor
>> and later on try to lex a token because we haven't reached the end of
>> file.
>>
>> Also clang crashes only on code completion in included file, i.e. when
>> IncludeMacroStack is not empty. Though we reset CurLexer even if include
>> stack is empty. The difference is that during pushing back a semicolon
>> token, preprocessor calls EnterCachingLexMode which decides it is
>> already in caching mode because various lexers are null and
>> IncludeMacroStack is not empty. As the result, CurLexerKind remains
>> CLK_Lexer instead of updating to CLK_CachingLexer.
>>
>> rdar://problem/34787685
>>
>> Reviewers: akyrtzi, doug.gregor, arphaman
>>
>> Reviewed By: arphaman
>>
>> Subscribers: cfe-commits, kfunk, arphaman, nemanjai, kbarton
>>
>> Differential Revision: https://reviews.llvm.org/D41688
>>
>> Added:
>> cfe/trunk/test/CodeCompletion/Inputs/comments.h
>> cfe/trunk/test/CodeCompletion/comments.cpp
>> Modified:
>> cfe/trunk/lib/Lex/PPCaching.cpp
>> cfe/trunk/lib/Lex/PPLexerChange.cpp
>>
>> Modified: cfe/trunk/lib/Lex/PPCaching.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPCaching.cpp?rev=323008&r1=323007&r2=323008&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/PPCaching.cpp (original)
>> +++ cfe/trunk/lib/Lex/PPCaching.cpp Fri Jan 19 15:41:47 2018
>> @@ -105,8 +105,10 @@ void Preprocessor::CachingLex(Token &Res
>> }
>>
>> void Preprocessor::EnterCachingLexMode() {
>> - if (InCachingLexMode())
>> + if (InCachingLexMode()) {
>> + assert(CurLexerKind == CLK_CachingLexer && "Unexpected lexer kind");
>> return;
>> + }
>>
>> PushIncludeMacroStack();
>> CurLexerKind = CLK_CachingLexer;
>>
>> Modified: cfe/trunk/lib/Lex/PPLexerChange.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPLexerChange.cpp?rev=323008&r1=323007&r2=323008&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/PPLexerChange.cpp (original)
>> +++ cfe/trunk/lib/Lex/PPLexerChange.cpp Fri Jan 19 15:41:47 2018
>> @@ -444,6 +444,7 @@ bool Preprocessor::HandleEndOfFile(Token
>> }
>>
>> CurPPLexer = nullptr;
>> + recomputeCurLexerKind();
>> return true;
>> }
>>
>>
>> Added: cfe/trunk/test/CodeCompletion/Inputs/comments.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeCompletion/Inputs/comments.h?rev=323008&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/CodeCompletion/Inputs/comments.h (added)
>> +++ cfe/trunk/test/CodeCompletion/Inputs/comments.h Fri Jan 19 15:41:47 2018
>> @@ -0,0 +1,4 @@
>> +// PR32732
>> +struct B {
>> + // <- code completion
>> +};
>>
>> Added: cfe/trunk/test/CodeCompletion/comments.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeCompletion/comments.cpp?rev=323008&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/CodeCompletion/comments.cpp (added)
>> +++ cfe/trunk/test/CodeCompletion/comments.cpp Fri Jan 19 15:41:47 2018
>> @@ -0,0 +1,13 @@
>> +// Note: the run lines follow their respective tests, since line/column
>> +// matter in this test.
>> +
>> +#include "comments.h"
>> +
>> +struct A {
>> + // <- code completion
>> + /* <- code completion */
>> +};
>> +
>> +// RUN: %clang_cc1 -I %S/Inputs -fsyntax-only -code-completion-at=%s:7:6 %s
>> +// RUN: %clang_cc1 -I %S/Inputs -fsyntax-only -code-completion-at=%s:8:6 %s
>> +// RUN: %clang_cc1 -I %S/Inputs -fsyntax-only -code-completion-at=%S/Inputs/comments.h:3:6 %s
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list