]> granicus.if.org Git - clang/commitdiff
PR33902: Invalidate line number cache when adding more text to existing buffer.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 30 Jul 2017 06:31:29 +0000 (06:31 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 30 Jul 2017 06:31:29 +0000 (06:31 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@309503 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/ScratchBuffer.cpp
test/Misc/caret-diags-multiline.cpp

index cd8a27e76c28627887af7f5efc4e822f69846a22..e0f3966fce480e7cdc3ed15edae19c8e6584c577 100644 (file)
@@ -35,6 +35,14 @@ SourceLocation ScratchBuffer::getToken(const char *Buf, unsigned Len,
                                        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.
index 4826d9beaa3fc27d4022d6f194f288dde05cacd2..90b50ff398acefee04a247b6f16a20f81689bd0e 100644 (file)
@@ -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()