diff options
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 15 | ||||
| -rw-r--r-- | clang/test/Modules/embed-files.cpp | 8 |
2 files changed, 20 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 9b118d56f10..c0517e7db81 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -4541,14 +4541,25 @@ ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { SubmodulesLoaded[GlobalIndex] = CurrentModule; - // Clear out data that will be replaced by what is the module file. + // Clear out data that will be replaced by what is in the module file. CurrentModule->LinkLibraries.clear(); CurrentModule->ConfigMacros.clear(); CurrentModule->UnresolvedConflicts.clear(); CurrentModule->Conflicts.clear(); + + // The module is available unless it's missing a requirement; relevant + // requirements will be (re-)added by SUBMODULE_REQUIRES records. + // Missing headers that were present when the module was built do not + // make it unavailable -- if we got this far, this must be an explicitly + // imported module file. + CurrentModule->Requirements.clear(); + CurrentModule->MissingHeaders.clear(); + CurrentModule->IsMissingRequirement = + ParentModule && ParentModule->IsMissingRequirement; + CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement; break; } - + case SUBMODULE_UMBRELLA_HEADER: { std::string Filename = Blob; ResolveImportedPath(F, Filename); diff --git a/clang/test/Modules/embed-files.cpp b/clang/test/Modules/embed-files.cpp index a1db21852d0..f300558dd7f 100644 --- a/clang/test/Modules/embed-files.cpp +++ b/clang/test/Modules/embed-files.cpp @@ -1,11 +1,17 @@ // RUN: rm -rf %t // RUN: mkdir %t -// RUN: echo 'module a { header "a.h" } module b { header "b.h" }' > %t/modulemap +// RUN: echo 'module a { header "a.h" header "x.h" } module b { header "b.h" }' > %t/modulemap // RUN: echo 'extern int t;' > %t/t.h // RUN: echo '#include "t.h"' > %t/a.h // RUN: echo '#include "t.h"' > %t/b.h +// RUN: echo '#include "t.h"' > %t/x.h // RUN: %clang_cc1 -fmodules -I%t -fmodules-cache-path=%t -fmodule-map-file=%t/modulemap -fmodules-embed-all-files %s -verify +// +// RUN: %clang_cc1 -fmodules -I%t -fmodules-embed-all-files %t/modulemap -fmodule-name=a -x c++ -emit-module -o %t/a.pcm +// RUN: %clang_cc1 -fmodules -I%t -fmodules-embed-all-files %t/modulemap -fmodule-name=b -x c++ -emit-module -o %t/b.pcm +// RUN: rm %t/x.h +// RUN: %clang_cc1 -fmodules -I%t -fmodule-map-file=%t/modulemap -fmodule-file=%t/a.pcm -fmodule-file=%t/b.pcm %s -verify #include "a.h" char t; // expected-error {{different type}} // expected-note@t.h:1 {{here}} |

