r309503 - PR33902: Invalidate line number cache when adding more text to existing buffer.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 31 10:02:32 PDT 2017


r309580. Thanks!

On Sat, Jul 29, 2017 at 11:33 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> We should take this fix for Clang 5.
>
> On 29 July 2017 at 23:31, Richard Smith via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: rsmith
>> Date: Sat Jul 29 23:31:29 2017
>> New Revision: 309503
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=309503&view=rev
>> Log:
>> PR33902: Invalidate line number cache when adding more text to existing
>> buffer.
>>
>> This led to crashes as the line number cache would report a bogus line
>> number
>> for a line of code, and we'd try to find a nonexistent column within the
>> line
>> when printing diagnostics.
>>
>> Modified:
>>     cfe/trunk/lib/Lex/ScratchBuffer.cpp
>>     cfe/trunk/test/Misc/caret-diags-multiline.cpp
>>
>> Modified: cfe/trunk/lib/Lex/ScratchBuffer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ScratchBuffer.cpp?rev=309503&r1=309502&r2=309503&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/ScratchBuffer.cpp (original)
>> +++ cfe/trunk/lib/Lex/ScratchBuffer.cpp Sat Jul 29 23:31:29 2017
>> @@ -35,6 +35,14 @@ SourceLocation ScratchBuffer::getToken(c
>>                                         const char *&DestPtr) {
>>    if (BytesUsed+Len+2 > ScratchBufSize)
>>      AllocScratchBuffer(Len+2);
>> +  else {
>> +    // Clear out the source line cache if it's already been computed.
>> +    // FIXME: Allow this to be incrementally extended.
>> +    auto *ContentCache = const_cast<SrcMgr::ContentCache *>(
>> +        SourceMgr.getSLocEntry(SourceMgr.getFileID(BufferStartLoc))
>> +                 .getFile().getContentCache());
>> +    ContentCache->SourceLineCache = nullptr;
>> +  }
>>
>>    // Prefix the token with a \n, so that it looks like it is the first
>> thing on
>>    // its own virtual line in caret diagnostics.
>>
>> Modified: cfe/trunk/test/Misc/caret-diags-multiline.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/caret-diags-multiline.cpp?rev=309503&r1=309502&r2=309503&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/Misc/caret-diags-multiline.cpp (original)
>> +++ cfe/trunk/test/Misc/caret-diags-multiline.cpp Sat Jul 29 23:31:29 2017
>> @@ -232,3 +232,8 @@ void multiple_ranges(int a, int b) {
>>    b
>>    );
>>  }
>> +
>> +#define pr33902_a(b) #b
>> +#define pr33902_c(d) _Pragma(pr33902_a(d))
>> +#define pr33902_e(f) pr33902_c(GCC warning #f)
>> +pr33902_e() pr33902_e()
>>
>>
>> _______________________________________________
>> 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