<div dir="ltr">I haven't done a ton of investigation yet, but I suspect this commit is responsible for breaking my LLVM module selfhost build, which uses libc++ as the STL, and builds LLD (No bots appear to test this configuration).<div><br></div><div>The error message can be found here:</div><div><a href="https://gist.github.com/EricWF/fb5e1d18eb1069d23788469b5fb15442">https://gist.github.com/EricWF/fb5e1d18eb1069d23788469b5fb15442</a><br></div><div><br></div><div>I'll investigate further tomorrow, but I wanted to send this your way in case it looks familiar.</div><div><br></div><div>/Eric</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 4, 2018 at 7:33 PM, Bruno Cardoso Lopes via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: bruno<br>
Date: Thu Jan  4 18:33:18 2018<br>
New Revision: 321855<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=321855&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=321855&view=rev</a><br>
Log:<br>
Reapply r321781: [Modules] Allow modules specified by -fmodule-map-file to shadow implicitly found ones<br>
<br>
When modules come from module map files explicitly specified by<br>
-fmodule-map-file= arguments, allow those to override/shadow modules<br>
with the same name that are found implicitly by header search. If such a<br>
module is looked up by name (e.g. @import), we will always find the one<br>
from -fmodule-map-file. If we try to use a shadowed module by including<br>
one of its headers report an error.<br>
<br>
This enables developers to force use of a specific copy of their module<br>
to be used if there are multiple copies that would otherwise be visible,<br>
for example if they develop modules that are installed in the default<br>
search paths.<br>
<br>
Patch originally by Ben Langmuir,<br>
<a href="http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20151116/143425.html" rel="noreferrer" target="_blank">http://lists.llvm.org/<wbr>pipermail/cfe-commits/Week-of-<wbr>Mon-20151116/143425.html</a><br>
<br>
Based on cfe-dev discussion:<br>
<a href="http://lists.llvm.org/pipermail/cfe-dev/2015-November/046164.html" rel="noreferrer" target="_blank">http://lists.llvm.org/<wbr>pipermail/cfe-dev/2015-<wbr>November/046164.html</a><br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D31269" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D31269</a><br>
<br>
rdar://problem/23612102<br>
<br>
Added:<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/A.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/module.modulemap<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/A.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/module.modulemap<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/Foo.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/module.<wbr>modulemap<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A2.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/Foo.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/module.<wbr>modulemap<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A2.h<br>
    cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/Foo/module.<wbr>modulemap<br>
    cfe/trunk/test/Modules/shadow.<wbr>m<br>
    cfe/trunk/test/Modules/<wbr>shadowed-submodule.m<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/<wbr>DiagnosticCommonKinds.td<br>
    cfe/trunk/include/clang/Basic/<wbr>Module.h<br>
    cfe/trunk/include/clang/Lex/<wbr>HeaderSearch.h<br>
    cfe/trunk/include/clang/Lex/<wbr>ModuleMap.h<br>
    cfe/trunk/lib/Basic/Module.cpp<br>
    cfe/trunk/lib/Lex/<wbr>HeaderSearch.cpp<br>
    cfe/trunk/lib/Lex/ModuleMap.<wbr>cpp<br>
    cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>DiagnosticCommonKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/<wbr>DiagnosticCommonKinds.td?rev=<wbr>321855&r1=321854&r2=321855&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>DiagnosticCommonKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>DiagnosticCommonKinds.td Thu Jan  4 18:33:18 2018<br>
@@ -94,6 +94,9 @@ def remark_module_lock_failure : Remark<<br>
   "could not acquire lock file for module '%0': %1">, InGroup<ModuleBuild>;<br>
 def remark_module_lock_timeout : Remark<<br>
   "timed out waiting to acquire lock file for module '%0'">, InGroup<ModuleBuild>;<br>
+def err_module_shadowed : Error<"import of shadowed module '%0'">, DefaultFatal;<br>
+def err_module_build_shadowed_<wbr>submodule : Error<<br>
+  "build a shadowed submodule '%0'">, DefaultFatal;<br>
 def err_module_cycle : Error<"cyclic dependency in module '%0': %1">,<br>
   DefaultFatal;<br>
 def err_module_prebuilt : Error<<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>Module.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Module.h?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/Module.h?rev=<wbr>321855&r1=321854&r2=321855&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>Module.h (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>Module.h Thu Jan  4 18:33:18 2018<br>
@@ -197,6 +197,9 @@ public:<br>
   /// will be false to indicate that this (sub)module is not available.<br>
   SmallVector<Requirement, 2> Requirements;<br>
<br>
+  /// \brief A module with the same name that shadows this module.<br>
+  Module *ShadowingModule = nullptr;<br>
+<br>
   /// \brief Whether this module is missing a feature from \c Requirements.<br>
   unsigned IsMissingRequirement : 1;<br>
<br>
@@ -375,13 +378,20 @@ public:<br>
   ///<br>
   /// \param Target The target options used for the current translation unit.<br>
   ///<br>
-  /// \param Req If this module is unavailable, this parameter<br>
-  /// will be set to one of the requirements that is not met for use of<br>
-  /// this module.<br>
+  /// \param Req If this module is unavailable because of a missing requirement,<br>
+  /// this parameter will be set to one of the requirements that is not met for<br>
+  /// use of this module.<br>
+  ///<br>
+  /// \param MissingHeader If this module is unavailable because of a missing<br>
+  /// header, this parameter will be set to one of the missing headers.<br>
+  ///<br>
+  /// \param ShadowingModule If this module is unavailable because it is<br>
+  /// shadowed, this parameter will be set to the shadowing module.<br>
   bool isAvailable(const LangOptions &LangOpts,<br>
                    const TargetInfo &Target,<br>
                    Requirement &Req,<br>
-                   UnresolvedHeaderDirective &MissingHeader) const;<br>
+                   UnresolvedHeaderDirective &MissingHeader,<br>
+                   Module *&ShadowingModule) const;<br>
<br>
   /// \brief Determine whether this module is a submodule.<br>
   bool isSubModule() const { return Parent != nullptr; }<br>
<br>
Modified: cfe/trunk/include/clang/Lex/<wbr>HeaderSearch.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Lex/HeaderSearch.h?rev=<wbr>321855&r1=321854&r2=321855&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Lex/<wbr>HeaderSearch.h (original)<br>
+++ cfe/trunk/include/clang/Lex/<wbr>HeaderSearch.h Thu Jan  4 18:33:18 2018<br>
@@ -726,6 +726,7 @@ private:<br>
   LoadModuleMapResult loadModuleMapFileImpl(const FileEntry *File,<br>
                                             bool IsSystem,<br>
                                             const DirectoryEntry *Dir,<br>
+                                            bool IsExplicitlyProvided,<br>
                                             FileID ID = FileID(),<br>
                                             unsigned *Offset = nullptr);<br>
<br>
<br>
Modified: cfe/trunk/include/clang/Lex/<wbr>ModuleMap.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleMap.h?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Lex/ModuleMap.h?rev=<wbr>321855&r1=321854&r2=321855&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Lex/<wbr>ModuleMap.h (original)<br>
+++ cfe/trunk/include/clang/Lex/<wbr>ModuleMap.h Thu Jan  4 18:33:18 2018<br>
@@ -98,6 +98,9 @@ class ModuleMap {<br>
   /// \brief The top-level modules that are known.<br>
   llvm::StringMap<Module *> Modules;<br>
<br>
+  /// Shadow modules created while building this module map.<br>
+  llvm::SmallVector<Module*, 2> ShadowModules;<br>
+<br>
   /// \brief The number of modules we have created in total.<br>
   unsigned NumCreatedModules = 0;<br>
<br>
@@ -195,6 +198,17 @@ private:<br>
   /// header.<br>
   llvm::DenseMap<const DirectoryEntry *, Module *> UmbrellaDirs;<br>
<br>
+  /// \brief The set of modules provided explicitly (e.g. by -fmodule-map-file),<br>
+  /// which are allowed to shadow other implicitly discovered modules.<br>
+  llvm::DenseSet<const Module *> ExplicitlyProvidedModules;<br>
+<br>
+  bool mayShadowModuleBeingParsed(<wbr>Module *ExistingModule,<br>
+                                  bool IsExplicitlyProvided) {<br>
+    assert(!ExistingModule->Parent && "expected top-level module");<br>
+    return !IsExplicitlyProvided &&<br>
+           ExplicitlyProvidedModules.<wbr>count(ExistingModule);<br>
+  }<br>
+<br>
   /// \brief The set of attributes that can be attached to a module.<br>
   struct Attributes {<br>
     /// \brief Whether this is a system module.<br>
@@ -475,9 +489,9 @@ public:<br>
   ///<br>
   /// \returns The found or newly-created module, along with a boolean value<br>
   /// that will be true if the module is newly-created.<br>
-  std::pair<Module *, bool> findOrCreateModule(StringRef Name, Module *Parent,<br>
-                                               bool IsFramework,<br>
-                                               bool IsExplicit);<br>
+  std::pair<Module *, bool><br>
+  findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,<br>
+                     bool IsExplicit, bool UsesExplicitModuleMapFile = false);<br>
<br>
   /// \brief Create a 'global module' for a C++ Modules TS module interface<br>
   /// unit.<br>
@@ -502,6 +516,11 @@ public:<br>
   Module *inferFrameworkModule(const DirectoryEntry *FrameworkDir,<br>
                                bool IsSystem, Module *Parent);<br>
<br>
+  /// \brief Create a new top-level module that is shadowed by<br>
+  /// \p ShadowingModule.<br>
+  Module *createShadowedModule(<wbr>StringRef Name, bool IsFramework,<br>
+                               Module *ShadowingModule);<br>
+<br>
   /// \brief Retrieve the module map file containing the definition of the given<br>
   /// module.<br>
   ///<br>
@@ -587,6 +606,8 @@ public:<br>
   /// \brief Marks this header as being excluded from the given module.<br>
   void excludeHeader(Module *Mod, Module::Header Header);<br>
<br>
+  void setExplicitlyProvided(Module *Mod);<br>
+<br>
   /// \brief Parse the given module map file, and record any modules we<br>
   /// encounter.<br>
   ///<br>
@@ -606,10 +627,15 @@ public:<br>
   /// \param ExternModuleLoc The location of the "extern module" declaration<br>
   ///        that caused us to load this module map file, if any.<br>
   ///<br>
+  /// \param IsExplicitlyProvided Whether this module map file was provided<br>
+  /// explicitly by the user (e.g. -fmodule-map-file), rather than found<br>
+  /// implicitly.<br>
+  ///<br>
   /// \returns true if an error occurred, false otherwise.<br>
   bool parseModuleMapFile(const FileEntry *File, bool IsSystem,<br>
-                          const DirectoryEntry *HomeDir, FileID ID = FileID(),<br>
-                          unsigned *Offset = nullptr,<br>
+                          const DirectoryEntry *HomeDir,<br>
+                          bool IsExplicitlyProvided = false,<br>
+                          FileID ID = FileID(), unsigned *Offset = nullptr,<br>
                           SourceLocation ExternModuleLoc = SourceLocation());<br>
<br>
   /// \brief Dump the contents of the module map, for debugging purposes.<br>
<br>
Modified: cfe/trunk/lib/Basic/Module.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Basic/<wbr>Module.cpp?rev=321855&r1=<wbr>321854&r2=321855&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Basic/Module.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Module.cpp Thu Jan  4 18:33:18 2018<br>
@@ -95,11 +95,16 @@ static bool hasFeature(StringRef Feature<br>
<br>
 bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target,<br>
                          Requirement &Req,<br>
-                         UnresolvedHeaderDirective &MissingHeader) const {<br>
+                         UnresolvedHeaderDirective &MissingHeader,<br>
+                         Module *&ShadowingModule) const {<br>
   if (IsAvailable)<br>
     return true;<br>
<br>
   for (const Module *Current = this; Current; Current = Current->Parent) {<br>
+    if (Current->ShadowingModule) {<br>
+      ShadowingModule = Current->ShadowingModule;<br>
+      return false;<br>
+    }<br>
     for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) {<br>
       if (hasFeature(Current-><wbr>Requirements[I].first, LangOpts, Target) !=<br>
               Current->Requirements[I].<wbr>second) {<br>
<br>
Modified: cfe/trunk/lib/Lex/<wbr>HeaderSearch.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Lex/<wbr>HeaderSearch.cpp?rev=321855&<wbr>r1=321854&r2=321855&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Lex/<wbr>HeaderSearch.cpp (original)<br>
+++ cfe/trunk/lib/Lex/<wbr>HeaderSearch.cpp Thu Jan  4 18:33:18 2018<br>
@@ -1367,7 +1367,8 @@ bool HeaderSearch::<wbr>loadModuleMapFile(con<br>
     }<br>
   }<br>
<br>
-  switch (loadModuleMapFileImpl(File, IsSystem, Dir, ID, Offset)) {<br>
+  switch (loadModuleMapFileImpl(File, IsSystem, Dir,<br>
+                                /*IsExplictlyProvided=*/true, ID, Offset)) {<br>
   case LMM_AlreadyLoaded:<br>
   case LMM_NewlyLoaded:<br>
     return false;<br>
@@ -1378,10 +1379,9 @@ bool HeaderSearch::<wbr>loadModuleMapFile(con<br>
   llvm_unreachable("Unknown load module map result");<br>
 }<br>
<br>
-HeaderSearch::<wbr>LoadModuleMapResult<br>
-HeaderSearch::<wbr>loadModuleMapFileImpl(const FileEntry *File, bool IsSystem,<br>
-                                    const DirectoryEntry *Dir, FileID ID,<br>
-                                    unsigned *Offset) {<br>
+HeaderSearch::<wbr>LoadModuleMapResult HeaderSearch::<wbr>loadModuleMapFileImpl(<br>
+    const FileEntry *File, bool IsSystem, const DirectoryEntry *Dir,<br>
+    bool IsExplicitlyProvided, FileID ID, unsigned *Offset) {<br>
   assert(File && "expected FileEntry");<br>
<br>
   // Check whether we've already loaded this module map, and mark it as being<br>
@@ -1390,14 +1390,16 @@ HeaderSearch::<wbr>loadModuleMapFileImpl(cons<br>
   if (!AddResult.second)<br>
     return AddResult.first->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap;<br>
<br>
-  if (ModMap.parseModuleMapFile(<wbr>File, IsSystem, Dir, ID, Offset)) {<br>
+  if (ModMap.parseModuleMapFile(<wbr>File, IsSystem, Dir, IsExplicitlyProvided, ID,<br>
+                                Offset)) {<br>
     LoadedModuleMaps[File] = false;<br>
     return LMM_InvalidModuleMap;<br>
   }<br>
<br>
   // Try to load a corresponding private module map.<br>
   if (const FileEntry *PMMFile = getPrivateModuleMap(File, FileMgr)) {<br>
-    if (ModMap.parseModuleMapFile(<wbr>PMMFile, IsSystem, Dir)) {<br>
+    if (ModMap.parseModuleMapFile(<wbr>PMMFile, IsSystem, Dir,<br>
+                                  IsExplicitlyProvided)) {<br>
       LoadedModuleMaps[File] = false;<br>
       return LMM_InvalidModuleMap;<br>
     }<br>
@@ -1468,8 +1470,8 @@ HeaderSearch::<wbr>loadModuleMapFile(const Di<br>
     return KnownDir->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap;<br>
<br>
   if (const FileEntry *ModuleMapFile = lookupModuleMapFile(Dir, IsFramework)) {<br>
-    LoadModuleMapResult Result =<br>
-        loadModuleMapFileImpl(<wbr>ModuleMapFile, IsSystem, Dir);<br>
+    LoadModuleMapResult Result = loadModuleMapFileImpl(<br>
+        ModuleMapFile, IsSystem, Dir, /*IsExplicitlyProvided=*/<wbr>false);<br>
     // Add Dir explicitly in case ModuleMapFile is in a subdirectory.<br>
     // E.g. Foo.framework/Modules/module.<wbr>modulemap<br>
     //      ^Dir                  ^ModuleMapFile<br>
<br>
Modified: cfe/trunk/lib/Lex/ModuleMap.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Lex/<wbr>ModuleMap.cpp?rev=321855&r1=<wbr>321854&r2=321855&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Lex/ModuleMap.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/Lex/ModuleMap.<wbr>cpp Thu Jan  4 18:33:18 2018<br>
@@ -281,6 +281,8 @@ ModuleMap::ModuleMap(<wbr>SourceManager &Sour<br>
 ModuleMap::~ModuleMap() {<br>
   for (auto &M : Modules)<br>
     delete M.getValue();<br>
+  for (auto *M : ShadowModules)<br>
+    delete M;<br>
 }<br>
<br>
 void ModuleMap::setTarget(const TargetInfo &Target) {<br>
@@ -744,14 +746,13 @@ Module *ModuleMap::<wbr>lookupModuleQualified<br>
   return Context->findSubmodule(Name);<br>
 }<br>
<br>
-std::pair<Module *, bool> ModuleMap::findOrCreateModule(<wbr>StringRef Name,<br>
-                                                        Module *Parent,<br>
-                                                        bool IsFramework,<br>
-                                                        bool IsExplicit) {<br>
+std::pair<Module *, bool><br>
+ModuleMap::<wbr>findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,<br>
+                              bool IsExplicit, bool UsesExplicitModuleMapFile) {<br>
   // Try to find an existing module with this name.<br>
   if (Module *Sub = lookupModuleQualified(Name, Parent))<br>
     return std::make_pair(Sub, false);<br>
-<br>
+<br>
   // Create a new module with this name.<br>
   Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,<br>
                               IsExplicit, NumCreatedModules++);<br>
@@ -759,6 +760,8 @@ std::pair<Module *, bool> ModuleMap::fin<br>
     if (LangOpts.CurrentModule == Name)<br>
       SourceModule = Result;<br>
     Modules[Name] = Result;<br>
+    if (UsesExplicitModuleMapFile)<br>
+      ExplicitlyProvidedModules.<wbr>insert(Result);<br>
   }<br>
   return std::make_pair(Result, true);<br>
 }<br>
@@ -999,6 +1002,20 @@ Module *ModuleMap::<wbr>inferFrameworkModule(<br>
   return Result;<br>
 }<br>
<br>
+Module *ModuleMap::<wbr>createShadowedModule(StringRef Name, bool IsFramework,<br>
+                                        Module *ShadowingModule) {<br>
+<br>
+  // Create a new module with this name.<br>
+  Module *Result =<br>
+      new Module(Name, SourceLocation(), /*Parent=*/nullptr, IsFramework,<br>
+                 /*IsExplicit=*/false, NumCreatedModules++);<br>
+  Result->ShadowingModule = ShadowingModule;<br>
+  Result->IsAvailable = false;<br>
+  ShadowModules.push_back(<wbr>Result);<br>
+<br>
+  return Result;<br>
+}<br>
+<br>
 void ModuleMap::setUmbrellaHeader(<wbr>Module *Mod, const FileEntry *UmbrellaHeader,<br>
                                   Twine NameAsWritten) {<br>
   Headers[UmbrellaHeader].push_<wbr>back(KnownHeader(Mod, NormalHeader));<br>
@@ -1116,6 +1133,11 @@ void ModuleMap::excludeHeader(<wbr>Module *Mo<br>
   Mod->Headers[Module::HK_<wbr>Excluded].push_back(std::move(<wbr>Header));<br>
 }<br>
<br>
+void ModuleMap::<wbr>setExplicitlyProvided(Module *Mod) {<br>
+  assert(Modules[Mod->Name] == Mod && "explicitly provided module is shadowed");<br>
+  ExplicitlyProvidedModules.<wbr>insert(Mod);<br>
+}<br>
+<br>
 const FileEntry *<br>
 ModuleMap::<wbr>getContainingModuleMapFile(<wbr>const Module *Module) const {<br>
   if (Module->DefinitionLoc.<wbr>isInvalid())<br>
@@ -1319,7 +1341,9 @@ namespace clang {<br>
<br>
     /// \brief Consume the current token and return its location.<br>
     SourceLocation consumeToken();<br>
-<br>
+<br>
+    bool UsesExplicitModuleMapFile = false;<br>
+<br>
     /// \brief Skip tokens until we reach the a token with the given kind<br>
     /// (or the end of the file).<br>
     void skipUntil(MMToken::TokenKind K);<br>
@@ -1345,20 +1369,19 @@ namespace clang {<br>
     bool parseOptionalAttributes(<wbr>Attributes &Attrs);<br>
<br>
   public:<br>
-    explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,<br>
-                             const TargetInfo *Target,<br>
-                             DiagnosticsEngine &Diags,<br>
-                             ModuleMap &Map,<br>
-                             const FileEntry *ModuleMapFile,<br>
-                             const DirectoryEntry *Directory,<br>
-                             bool IsSystem)<br>
+    explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,<br>
+                             const TargetInfo *Target, DiagnosticsEngine &Diags,<br>
+                             ModuleMap &Map, const FileEntry *ModuleMapFile,<br>
+                             const DirectoryEntry *Directory, bool IsSystem,<br>
+                             bool UsesExplicitModuleMapFile)<br>
         : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map),<br>
           ModuleMapFile(ModuleMapFile), Directory(Directory),<br>
-          IsSystem(IsSystem) {<br>
+          IsSystem(IsSystem),<br>
+          UsesExplicitModuleMapFile(<wbr>UsesExplicitModuleMapFile) {<br>
       Tok.clear();<br>
       consumeToken();<br>
     }<br>
-<br>
+<br>
     bool parseModuleMapFile();<br>
<br>
     bool terminatedByDirective() { return false; }<br>
@@ -1787,6 +1810,7 @@ void ModuleMapParser::<wbr>parseModuleDecl()<br>
   SourceLocation LBraceLoc = consumeToken();<br>
<br>
   // Determine whether this (sub)module has already been defined.<br>
+  Module *ShadowingModule = nullptr;<br>
   if (Module *Existing = Map.lookupModuleQualified(<wbr>ModuleName, ActiveModule)) {<br>
     // We might see a (re)definition of a module that we already have a<br>
     // definition for in two cases:<br>
@@ -1812,23 +1836,36 @@ void ModuleMapParser::<wbr>parseModuleDecl()<br>
       }<br>
       return;<br>
     }<br>
-<br>
-    Diags.Report(ModuleNameLoc, diag::err_mmap_module_<wbr>redefinition)<br>
-      << ModuleName;<br>
-    Diags.Report(Existing-><wbr>DefinitionLoc, diag::note_mmap_prev_<wbr>definition);<br>
-<br>
-    // Skip the module definition.<br>
-    skipUntil(MMToken::RBrace);<br>
-    if (Tok.is(MMToken::RBrace))<br>
-      consumeToken();<br>
-<br>
-    HadError = true;<br>
-    return;<br>
+<br>
+    if (!Existing->Parent &&<br>
+        Map.<wbr>mayShadowModuleBeingParsed(<wbr>Existing, UsesExplicitModuleMapFile)) {<br>
+      ShadowingModule = Existing;<br>
+    } else {<br>
+      // This is not a shawdowed module decl, it is an illegal redefinition.<br>
+      Diags.Report(ModuleNameLoc, diag::err_mmap_module_<wbr>redefinition)<br>
+          << ModuleName;<br>
+      Diags.Report(Existing-><wbr>DefinitionLoc, diag::note_mmap_prev_<wbr>definition);<br>
+<br>
+      // Skip the module definition.<br>
+      skipUntil(MMToken::RBrace);<br>
+      if (Tok.is(MMToken::RBrace))<br>
+        consumeToken();<br>
+<br>
+      HadError = true;<br>
+      return;<br>
+    }<br>
   }<br>
<br>
   // Start defining this module.<br>
-  ActiveModule = Map.findOrCreateModule(<wbr>ModuleName, ActiveModule, Framework,<br>
-                                        Explicit).first;<br>
+  if (ShadowingModule) {<br>
+    ActiveModule =<br>
+        Map.createShadowedModule(<wbr>ModuleName, Framework, ShadowingModule);<br>
+  } else {<br>
+    ActiveModule = Map.findOrCreateModule(<wbr>ModuleName, ActiveModule, Framework,<br>
+                                          Explicit, UsesExplicitModuleMapFile)<br>
+                       .first;<br>
+  }<br>
+<br>
   ActiveModule->DefinitionLoc = ModuleNameLoc;<br>
   if (Attrs.IsSystem || IsSystem)<br>
     ActiveModule->IsSystem = true;<br>
@@ -2004,7 +2041,7 @@ void ModuleMapParser::<wbr>parseExternModuleD<br>
         Map.HeaderInfo.<wbr>getHeaderSearchOpts().<wbr>ModuleMapFileHomeIsCwd<br>
             ? Directory<br>
             : File->getDir(),<br>
-        FileID(), nullptr, ExternLoc);<br>
+        false /*IsExplicitlyProvided*/, FileID(), nullptr, ExternLoc);<br>
 }<br>
<br>
 /// Whether to add the requirement \p Feature to the module \p M.<br>
@@ -2811,7 +2848,8 @@ bool ModuleMapParser::<wbr>parseModuleMapFile<br>
 }<br>
<br>
 bool ModuleMap::parseModuleMapFile(<wbr>const FileEntry *File, bool IsSystem,<br>
-                                   const DirectoryEntry *Dir, FileID ID,<br>
+                                   const DirectoryEntry *Dir,<br>
+                                   bool IsExplicitlyProvided, FileID ID,<br>
                                    unsigned *Offset,<br>
                                    SourceLocation ExternModuleLoc) {<br>
   assert(Target && "Missing target information");<br>
@@ -2841,7 +2879,7 @@ bool ModuleMap::parseModuleMapFile(<wbr>const<br>
           Buffer->getBufferEnd());<br>
   SourceLocation Start = L.getSourceLocation();<br>
   ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir,<br>
-                         IsSystem);<br>
+                         IsSystem, IsExplicitlyProvided);<br>
   bool Result = Parser.parseModuleMapFile();<br>
   ParsedModuleMap[File] = Result;<br>
<br>
@@ -2854,5 +2892,6 @@ bool ModuleMap::parseModuleMapFile(<wbr>const<br>
   // Notify callbacks that we parsed it.<br>
   for (const auto &Cb : Callbacks)<br>
     Cb->moduleMapFileRead(Start, *File, IsSystem);<br>
+<br>
   return Result;<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=321855&r1=321854&r2=321855&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp?rev=321855&<wbr>r1=321854&r2=321855&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp (original)<br>
+++ cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp Thu Jan  4 18:33:18 2018<br>
@@ -1655,12 +1655,18 @@ bool Preprocessor::<wbr>checkModuleIsAvailabl<br>
                                           DiagnosticsEngine &Diags, Module *M) {<br>
   Module::Requirement Requirement;<br>
   Module::<wbr>UnresolvedHeaderDirective MissingHeader;<br>
-  if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader))<br>
+  Module *ShadowingModule = nullptr;<br>
+  if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader,<br>
+                     ShadowingModule))<br>
     return false;<br>
<br>
   if (MissingHeader.FileNameLoc.<wbr>isValid()) {<br>
     Diags.Report(MissingHeader.<wbr>FileNameLoc, diag::err_module_header_<wbr>missing)<br>
         << MissingHeader.IsUmbrella << MissingHeader.FileName;<br>
+  } else if (ShadowingModule) {<br>
+    Diags.Report(M->DefinitionLoc, diag::err_module_shadowed) << M->Name;<br>
+    Diags.Report(ShadowingModule-><wbr>DefinitionLoc,<br>
+                 diag::note_previous_<wbr>definition);<br>
   } else {<br>
     // FIXME: Track the location at which the requirement was specified, and<br>
     // use it here.<br>
@@ -2024,6 +2030,15 @@ void Preprocessor::<wbr>HandleIncludeDirectiv<br>
<br>
   // Determine if we're switching to building a new submodule, and which one.<br>
   if (auto *M = SuggestedModule.getModule()) {<br>
+    if (M->getTopLevelModule()-><wbr>ShadowingModule) {<br>
+      // We are building a submodule that belongs to a shadowed module. This<br>
+      // means we find header files in the shadowed module.<br>
+      Diag(M->DefinitionLoc, diag::err_module_build_<wbr>shadowed_submodule)<br>
+        << M->getFullModuleName();<br>
+      Diag(M->getTopLevelModule()-><wbr>ShadowingModule-><wbr>DefinitionLoc,<br>
+           diag::note_previous_<wbr>definition);<br>
+      return;<br>
+    }<br>
     // When building a pch, -fmodule-name tells the compiler to textually<br>
     // include headers in the specified module. We are not building the<br>
     // specified module.<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/A.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadow/A1/A.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadow/A1/A.h?<wbr>rev=321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/A.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/A.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+#define A1_A_h<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/module.modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadow/A1/module.modulemap?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadow/A1/<wbr>module.modulemap?rev=321855&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/module.modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadow/A1/module.modulemap Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1,5 @@<br>
+module A {<br>
+  header "A.h"<br>
+}<br>
+<br>
+module A1 {}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/A.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadow/A2/A.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadow/A2/A.h?<wbr>rev=321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/A.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/A.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+#define A2_A_h<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/module.modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadow/A2/module.modulemap?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadow/A2/<wbr>module.modulemap?rev=321855&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/module.modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadow/A2/module.modulemap Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1,5 @@<br>
+module A {<br>
+  header "A.h"<br>
+}<br>
+<br>
+module A2 {}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/Foo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A1/Foo.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A1/Foo.h?rev=321855&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/Foo.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/Foo.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+#include <stdarg.h> // expected-error {{could not build module 'A'}}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/module.<wbr>modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A1/module.modulemap?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A1/module.modulemap?<wbr>rev=321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/module.<wbr>modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/module.<wbr>modulemap Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1,14 @@<br>
+module A [system] { // expected-note {{previous definition is here}}<br>
+  module sub {<br>
+    header "sys/A.h"<br>
+  }<br>
+  module sub2 {<br>
+    header "sys/A2.h"<br>
+  }<br>
+  module stdarg {<br>
+    header "stdarg.h"<br>
+    export *<br>
+  }<br>
+}<br>
+<br>
+module A2 {}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A1/sys/A.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A1/sys/A.h?rev=<wbr>321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+#include <sys/A2.h><br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A2.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A1/sys/A2.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A1/sys/A2.h?rev=<wbr>321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A2.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A1/sys/A2.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+// nothing<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/Foo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A2/Foo.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A2/Foo.h?rev=321855&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/Foo.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/Foo.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+#include <stdarg.h><br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/module.<wbr>modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A2/module.modulemap?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A2/module.modulemap?<wbr>rev=321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/module.<wbr>modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/module.<wbr>modulemap Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1,14 @@<br>
+module A [system] {<br>
+  module sub {<br>
+    header "sys/A.h"<br>
+  }<br>
+  module sub2 { // expected-error {{build a shadowed submodule 'A.sub2'}}<br>
+    header "sys/A2.h"<br>
+  }<br>
+  module stdarg {<br>
+    header "stdarg.h"<br>
+    export *<br>
+  }<br>
+}<br>
+<br>
+module A2 {}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A2/sys/A.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A2/sys/A.h?rev=<wbr>321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+#include <sys/A2.h><br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A2.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/A2/sys/A2.h?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/A2/sys/A2.h?rev=<wbr>321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A2.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/A2/sys/A2.h Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1 @@<br>
+// nothing<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/Foo/module.<wbr>modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/shadowed-submodule/Foo/module.modulemap?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/shadowed-<wbr>submodule/Foo/module.<wbr>modulemap?rev=321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/Foo/module.<wbr>modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/<wbr>shadowed-submodule/Foo/module.<wbr>modulemap Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1,3 @@<br>
+module Foo {<br>
+  header "../A1/Foo.h"<br>
+}<br>
<br>
Added: cfe/trunk/test/Modules/shadow.<wbr>m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/shadow.m?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/shadow.m?rev=321855&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/shadow.<wbr>m (added)<br>
+++ cfe/trunk/test/Modules/shadow.<wbr>m Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1,21 @@<br>
+// RUN: rm -rf %t<br>
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs/shadow/A1 -I %S/Inputs/shadow/A2 %s -fsyntax-only 2>&1 | FileCheck %s -check-prefix=REDEFINITION<br>
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fmodule-map-file=%S/Inputs/<wbr>shadow/A1/module.modulemap -fmodule-map-file=%S/Inputs/<wbr>shadow/A2/module.modulemap %s -fsyntax-only 2>&1 | FileCheck %s -check-prefix=REDEFINITION<br>
+// REDEFINITION: error: redefinition of module 'A'<br>
+// REDEFINITION: note: previously defined<br>
+<br>
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fmodule-map-file=%S/Inputs/<wbr>shadow/A1/module.modulemap -I %S/Inputs/shadow %s -verify<br>
+<br>
+@import A1;<br>
+@import A2;<br>
+@import A;<br>
+<br>
+#import "A2/A.h" // expected-note {{implicitly imported}}<br>
+// expected-error@A2/module.<wbr>modulemap:1 {{import of shadowed module 'A'}}<br>
+// expected-note@A1/module.<wbr>modulemap:1 {{previous definition}}<br>
+<br>
+#if defined(A2_A_h)<br>
+#error got the wrong definition of module A<br>
+#elif !defined(A1_A_h)<br>
+#error missing definition from A1<br>
+#endif<br>
<br>
Added: cfe/trunk/test/Modules/<wbr>shadowed-submodule.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/shadowed-submodule.m?rev=321855&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/shadowed-submodule.m?<wbr>rev=321855&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Modules/<wbr>shadowed-submodule.m (added)<br>
+++ cfe/trunk/test/Modules/<wbr>shadowed-submodule.m Thu Jan  4 18:33:18 2018<br>
@@ -0,0 +1,5 @@<br>
+// RUN: rm -rf %t<br>
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs/shadowed-submodule/<wbr>Foo -I %S/Inputs/shadowed-submodule/<wbr>A2 %s -verify<br>
+<br>
+@import Foo; // expected-error {{module 'A' was built in directory}}<br>
+             // expected-note@shadowed-<wbr>submodule.m:4 {{imported by module 'Foo'}}<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>