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

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 29 23:33:37 PDT 2017


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170729/3ca89f5a/attachment.html>


More information about the cfe-commits mailing list