diff --git a/clang/lib/Serialization/ModuleManager.cpp b/clang/lib/Serialization/ModuleManager.cpp index 3baaa0a4b280..b5ee41450208 100644 --- a/clang/lib/Serialization/ModuleManager.cpp +++ b/clang/lib/Serialization/ModuleManager.cpp @@ -132,21 +132,27 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type, // Initialize the stream New->StreamFile.init((const unsigned char *)New->Buffer->getBufferStart(), (const unsigned char *)New->Buffer->getBufferEnd()); + } - if (ExpectedSignature) { - New->Signature = ReadSignature(New->StreamFile); - if (New->Signature != ExpectedSignature) { - ErrorStr = New->Signature ? "signature mismatch" - : "could not read module signature"; + if (ExpectedSignature) { + if (NewModule) + ModuleEntry->Signature = ReadSignature(ModuleEntry->StreamFile); + else + assert(ModuleEntry->Signature == ReadSignature(ModuleEntry->StreamFile)); + if (ModuleEntry->Signature != ExpectedSignature) { + ErrorStr = ModuleEntry->Signature ? "signature mismatch" + : "could not read module signature"; + + if (NewModule) { // Remove the module file immediately, since removeModules might try to // invalidate the file cache for Entry, and that is not safe if this // module is *itself* up to date, but has an out-of-date importer. Modules.erase(Entry); Chain.pop_back(); - delete New; - return OutOfDate; + delete ModuleEntry; } + return OutOfDate; } } diff --git a/clang/test/Modules/rebuild.m b/clang/test/Modules/rebuild.m index 53a1fff90bbf..4d4d05529e7d 100644 --- a/clang/test/Modules/rebuild.m +++ b/clang/test/Modules/rebuild.m @@ -25,4 +25,21 @@ // RUN: diff %t/Module.pcm %t/Module.pcm.saved.2 // RUN: not diff %t/DependsOnModule.pcm %t/DependsOnModule.pcm.saved +// Rebuild Module, reset its timestamp, and verify its size hasn't changed +// RUN: rm %t/Module.pcm +// RUN: echo '@import Module;' | %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash -fsyntax-only -F %S/Inputs -x objective-c - +// RUN: touch -m -a -t 201101010000 %t/Module.pcm +// RUN: wc -c %t/Module.pcm > %t/Module.size +// RUN: diff %t/Module.size %t/Module.size.saved +// RUN: cp %t/Module.pcm %t/Module.pcm.saved.2 + +// Verify again with Module pre-imported. +// NOTE: if we change how the signature is created, this test may need updating. +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash -fsyntax-only -F %S/Inputs %s +// RUN: diff %t/Module.pcm %t/Module.pcm.saved.2 +// RUN: not diff %t/DependsOnModule.pcm %t/DependsOnModule.pcm.saved + +#ifdef PREIMPORT +@import Module; +#endif @import DependsOnModule;