From 5de65721bd31e57f883634d9f10b1bff75c4ffc2 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 19 Mar 2010 06:12:06 +0000 Subject: [PATCH] Fix a longstanding (but previously unknown) bug in the lazy deserialization of precompiled headers, where the deserialization of the source location entry for a buffer (e.g., macro instantiation scratch space) would overwrite a one-element FileID cache in the source manager. When tickled at the wrong time, we would return the wrong decomposed source location and eventually cause c-index-test to crash. Found by dumb luck. It's amazing this hasn't shown up before. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98940 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/SourceManager.cpp | 2 +- test/Index/c-index-getCursor-test.m | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 4c24d030b8..6def967c4c 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -411,7 +411,7 @@ FileID SourceManager::createFileID(const ContentCache *File, = SLocEntry::get(Offset, FileInfo::get(IncludePos, File, FileCharacter)); SLocEntryLoaded[PreallocatedID] = true; FileID FID = FileID::get(PreallocatedID); - return LastFileIDLookup = FID; + return FID; } SLocEntryTable.push_back(SLocEntry::get(NextOffset, diff --git a/test/Index/c-index-getCursor-test.m b/test/Index/c-index-getCursor-test.m index 8341b80a67..62701dbc0c 100644 --- a/test/Index/c-index-getCursor-test.m +++ b/test/Index/c-index-getCursor-test.m @@ -52,6 +52,12 @@ int main (int argc, const char * argv[]) { main(someEnum, (const char **)bee); } +#define CONCAT(X, Y) X##Y + +void f() { + int CONCAT(my,_var); +} + // CHECK: [1:1 - 3:1] Invalid Cursor => NoDeclFound // CHECK: [3:1 - 7:1] ObjCInterfaceDecl=Foo:3:12 // CHECK: [7:1 - 7:7] ObjCInstanceMethodDecl=foo:7:1 -- 2.50.1