]> granicus.if.org Git - clang/commitdiff
Fix a longstanding (but previously unknown) bug in the lazy
authorDouglas Gregor <dgregor@apple.com>
Fri, 19 Mar 2010 06:12:06 +0000 (06:12 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 19 Mar 2010 06:12:06 +0000 (06:12 +0000)
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
test/Index/c-index-getCursor-test.m

index 4c24d030b872ba3472239bf429819515e0934f7b..6def967c4cfa279c4c601016202232fa38e08218 100644 (file)
@@ -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,
index 8341b80a673f502625a7d79ce157f7dd51b5c229..62701dbc0c9045ff7ea0bc6ea5cb380f2841d181 100644 (file)
@@ -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