<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 18, 2017, at 3:11 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote">On 18 September 2017 at 14:34, Douglas Gregor via cfe-commits <span dir="ltr" class=""><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><br class=""><div class=""><span class=""><blockquote type="cite" class=""><div class="">On Sep 18, 2017, at 1:45 PM, Galina Kistanova <<a href="mailto:gkistanova@gmail.com" target="_blank" class="">gkistanova@gmail.com</a>> wrote:</div><br class="m_-855941535798960151Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hello Douglas,<br class=""><br class="">Your r313316 commit broke one of our builders on Thursday, Sep-14th.<br class=""><a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/17506" target="_blank" class="">http://lab.llvm.org:8011/<wbr class="">builders/llvm-clang-lld-x86_<wbr class="">64-scei-ps4-ubuntu-fast/<wbr class="">builds/17506</a><br class=""><br class="">Are you about to commit the fix, or shall I revert that commit to give you more time?<br class=""></div></div></blockquote><div class=""><br class=""></div></span>I’m unable to reproduce this issue, and it’s weirdly not hitting the other bots.</div><div class=""><br class=""></div><div class="">Is anyone able to reproduce this? The stack trace is… insufficient… to figure out what’s going on.</div></div></blockquote><div class=""><br class=""></div><div class="">I think that bot might be the only one with a target whose default C++ language mode is C++11.</div></div></div></div></div></blockquote><div><br class=""></div><div>Hmm. It’s not the C++ RUN lines that are failing, though; it’s the default (Objective-C) one.</div><div><br class=""></div><span class="Apple-tab-span" style="white-space:pre">       </span>- Doug</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class=""><span class="m_-855941535798960151Apple-tab-span" style="white-space:pre-wrap">        </span>- Doug</div><div class=""><div class="h5"><div class=""><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><br class="">Thanks<br class=""><br class="">Galina<br class=""></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Sep 14, 2017 at 4:38 PM, Douglas Gregor via cfe-commits <span dir="ltr" class=""><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dgregor<br class="">
Date: Thu Sep 14 16:38:44 2017<br class="">
New Revision: 313316<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=313316&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject?rev=313316&view=rev</a><br class="">
Log:<br class="">
[Module map] Introduce a private module re-export directive.<br class="">
<br class="">
Introduce a new "export_as" directive for top-level modules, which<br class="">
indicates that the current module is a "private" module whose symbols<br class="">
will eventually be exported through the named "public" module. This is<br class="">
in support of a common pattern in the Darwin ecosystem where a single<br class="">
public framework is constructed of several private frameworks, with<br class="">
(currently) header duplication and some support from the linker.<br class="">
<br class="">
Addresses <a class="">rdar://problem/34438420</a>.<br class="">
<br class="">
Added:<br class="">
    cfe/trunk/test/Modules/Inputs/<wbr class="">export_as_test.modulemap<br class="">
    cfe/trunk/test/Modules/export_<wbr class="">as_test.c<br class="">
Modified:<br class="">
    cfe/trunk/docs/Modules.rst<br class="">
    cfe/trunk/include/clang/Basic/<wbr class="">DiagnosticLexKinds.td<br class="">
    cfe/trunk/include/clang/Basic/<wbr class="">Module.h<br class="">
    cfe/trunk/include/clang/Serial<wbr class="">ization/ASTBitCodes.h<br class="">
    cfe/trunk/lib/Basic/Module.cpp<br class="">
    cfe/trunk/lib/Lex/ModuleMap.cp<wbr class="">p<br class="">
    cfe/trunk/lib/Serialization/AS<wbr class="">TReader.cpp<br class="">
    cfe/trunk/lib/Serialization/AS<wbr class="">TWriter.cpp<br class="">
<br class="">
Modified: cfe/trunk/docs/Modules.rst<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/Modules.rst?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/docs/Modules.<wbr class="">rst?rev=313316&r1=313315&r2=<wbr class="">313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/docs/Modules.rst (original)<br class="">
+++ cfe/trunk/docs/Modules.rst Thu Sep 14 16:38:44 2017<br class="">
@@ -323,11 +323,12 @@ Module map files use a simplified form o<br class="">
<br class="">
 .. parsed-literal::<br class="">
<br class="">
-  ``config_macros`` ``export``     ``private``<br class="">
+  ``config_macros`` ``export_as``  ``private``<br class="">
   ``conflict``      ``framework``  ``requires``<br class="">
   ``exclude``       ``header``     ``textual``<br class="">
   ``explicit``      ``link``       ``umbrella``<br class="">
   ``extern``        ``module``     ``use``<br class="">
+  ``export``<br class="">
<br class="">
 Module map file<br class="">
 ---------------<br class="">
@@ -387,6 +388,7 @@ Modules can have a number of different k<br class="">
     *umbrella-dir-declaration*<br class="">
     *submodule-declaration*<br class="">
     *export-declaration*<br class="">
+    *export-as-declaration*<br class="">
     *use-declaration*<br class="">
     *link-declaration*<br class="">
     *config-macros-declaration*<br class="">
@@ -666,6 +668,31 @@ Note that, if ``Derived.h`` includes ``B<br class="">
   compatibility for programs that rely on transitive inclusion (i.e.,<br class="">
   all of them).<br class="">
<br class="">
+Re-export Declaration<br class="">
+~~~~~~~~~~~~~~~~~~<br class="">
+An *export-as-declaration* specifies that the current module is a private<br class="">
+module whose interface will be re-exported by the named public module.<br class="">
+<br class="">
+.. parsed-literal::<br class="">
+<br class="">
+  *export-as-declaration*:<br class="">
+    ``export_as`` *identifier*<br class="">
+<br class="">
+The *export-as-declaration* names the public module that the current<br class="">
+(private) module will be re-exported through. Only top-level modules<br class="">
+can be re-exported, and any given module may only be re-exported<br class="">
+through a single public module.<br class="">
+<br class="">
+**Example:** In the following example, the (private) module<br class="">
+``MyFrameworkCore`` will be re-exported via the public module<br class="">
+``MyFramework``:<br class="">
+<br class="">
+.. parsed-literal::<br class="">
+<br class="">
+  module MyFrameworkCore {<br class="">
+    export_as MyFramework<br class="">
+  }<br class="">
+<br class="">
 Use declaration<br class="">
 ~~~~~~~~~~~~~~~<br class="">
 A *use-declaration* specifies another module that the current top-level module<br class="">
<br class="">
Modified: cfe/trunk/include/clang/Basic/<wbr class="">DiagnosticLexKinds.td<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/include/clang/<wbr class="">Basic/DiagnosticLexKinds.td?<wbr class="">rev=313316&r1=313315&r2=<wbr class="">313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/include/clang/Basic/<wbr class="">DiagnosticLexKinds.td (original)<br class="">
+++ cfe/trunk/include/clang/Basic/<wbr class="">DiagnosticLexKinds.td Thu Sep 14 16:38:44 2017<br class="">
@@ -674,6 +674,13 @@ def err_mmap_invalid_header_attrib<wbr class="">ute_va<br class="">
   "expected integer literal as value for header attribute '%0'">;<br class="">
 def err_mmap_expected_header_attri<wbr class="">bute : Error<<br class="">
   "expected a header attribute name ('size' or 'mtime')">;<br class="">
+def err_mmap_conflicting_export_as : Error<<br class="">
+  "conflicting re-export of module '%0' as '%1' or '%2'">;<br class="">
+def warn_mmap_redundant_export_as : Warning<<br class="">
+  "module '%0' already re-exported as '%1'">,<br class="">
+  InGroup<PrivateModule>;<br class="">
+def err_mmap_submodule_export_as : Error<<br class="">
+  "only top-level modules can be re-exported as public">;<br class="">
<br class="">
 def warn_auto_module_import : Warning<<br class="">
   "treating #%select{include|import|includ<wbr class="">e_next|__include_macros}0 as an "<br class="">
<br class="">
Modified: cfe/trunk/include/clang/Basic/<wbr class="">Module.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Module.h?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/include/clang/<wbr class="">Basic/Module.h?rev=313316&r1=<wbr class="">313315&r2=313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/include/clang/Basic/<wbr class="">Module.h (original)<br class="">
+++ cfe/trunk/include/clang/Basic/<wbr class="">Module.h Thu Sep 14 16:38:44 2017<br class="">
@@ -99,6 +99,10 @@ public:<br class="">
<br class="">
   /// \brief The name of the umbrella entry, as written in the module map.<br class="">
   std::string UmbrellaAsWritten;<br class="">
+<br class="">
+  /// \brief The module through which entities defined in this module will<br class="">
+  /// eventually be exposed, for use in "private" modules.<br class="">
+  std::string ExportAsModule;<br class="">
<br class="">
 private:<br class="">
   /// \brief The submodules of this module, indexed by name.<br class="">
<br class="">
Modified: cfe/trunk/include/clang/Serial<wbr class="">ization/ASTBitCodes.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/include/clang/<wbr class="">Serialization/ASTBitCodes.h?<wbr class="">rev=313316&r1=313315&r2=<wbr class="">313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/include/clang/Serial<wbr class="">ization/ASTBitCodes.h (original)<br class="">
+++ cfe/trunk/include/clang/Serial<wbr class="">ization/ASTBitCodes.h Thu Sep 14 16:38:44 2017<br class="">
@@ -716,6 +716,9 @@ namespace clang {<br class="">
       /// \brief Specifies some declarations with initializers that must be<br class="">
       /// emitted to initialize the module.<br class="">
       SUBMODULE_INITIALIZERS = 16,<br class="">
+      /// \brief Specifies the name of the module that will eventually<br class="">
+      /// re-export the entities in this module.<br class="">
+      SUBMODULE_EXPORT_AS = 17,<br class="">
     };<br class="">
<br class="">
     /// \brief Record types used within a comments block.<br class="">
<br class="">
Modified: cfe/trunk/lib/Basic/Module.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/lib/Basic/Modu<wbr class="">le.cpp?rev=313316&r1=313315&<wbr class="">r2=313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/Basic/Module.cpp (original)<br class="">
+++ cfe/trunk/lib/Basic/Module.cpp Thu Sep 14 16:38:44 2017<br class="">
@@ -440,6 +440,11 @@ void Module::print(raw_ostream &OS, unsi<br class="">
     }<br class="">
   }<br class="">
<br class="">
+  if (!ExportAsModule.empty()) {<br class="">
+    OS.indent(Indent + 2);<br class="">
+    OS << "export_as" << ExportAsModule << "\n";<br class="">
+  }<br class="">
+<br class="">
   for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end();<br class="">
        MI != MIEnd; ++MI)<br class="">
     // Print inferred subframework modules so that we don't need to re-infer<br class="">
<br class="">
Modified: cfe/trunk/lib/Lex/ModuleMap.cp<wbr class="">p<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/lib/Lex/Module<wbr class="">Map.cpp?rev=313316&r1=313315&<wbr class="">r2=313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/Lex/ModuleMap.cp<wbr class="">p (original)<br class="">
+++ cfe/trunk/lib/Lex/ModuleMap.cp<wbr class="">p Thu Sep 14 16:38:44 2017<br class="">
@@ -1201,6 +1201,7 @@ namespace clang {<br class="">
       ExcludeKeyword,<br class="">
       ExplicitKeyword,<br class="">
       ExportKeyword,<br class="">
+      ExportAsKeyword,<br class="">
       ExternKeyword,<br class="">
       FrameworkKeyword,<br class="">
       LinkKeyword,<br class="">
@@ -1312,6 +1313,7 @@ namespace clang {<br class="">
                          SourceLocation LeadingLoc);<br class="">
     void parseUmbrellaDirDecl(SourceLoc<wbr class="">ation UmbrellaLoc);<br class="">
     void parseExportDecl();<br class="">
+    void parseExportAsDecl();<br class="">
     void parseUseDecl();<br class="">
     void parseLinkDecl();<br class="">
     void parseConfigMacros();<br class="">
@@ -1363,6 +1365,7 @@ retry:<br class="">
                  .Case("exclude", MMToken::ExcludeKeyword)<br class="">
                  .Case("explicit", MMToken::ExplicitKeyword)<br class="">
                  .Case("export", MMToken::ExportKeyword)<br class="">
+                 .Case("export_as", MMToken::ExportAsKeyword)<br class="">
                  .Case("extern", MMToken::ExternKeyword)<br class="">
                  .Case("framework", MMToken::FrameworkKeyword)<br class="">
                  .Case("header", MMToken::HeaderKeyword)<br class="">
@@ -1590,6 +1593,7 @@ namespace {<br class="">
 ///     header-declaration<br class="">
 ///     submodule-declaration<br class="">
 ///     export-declaration<br class="">
+///     export-as-declaration<br class="">
 ///     link-declaration<br class="">
 ///<br class="">
 ///   submodule-declaration:<br class="">
@@ -1824,6 +1828,10 @@ void ModuleMapParser::parseModuleDe<wbr class="">cl()<br class="">
       parseExportDecl();<br class="">
       break;<br class="">
<br class="">
+    case MMToken::ExportAsKeyword:<br class="">
+      parseExportAsDecl();<br class="">
+      break;<br class="">
+<br class="">
     case MMToken::UseKeyword:<br class="">
       parseUseDecl();<br class="">
       break;<br class="">
@@ -2284,6 +2292,41 @@ void ModuleMapParser::parseExportDe<wbr class="">cl()<br class="">
   ActiveModule->UnresolvedExpor<wbr class="">ts.push_back(Unresolved);<br class="">
 }<br class="">
<br class="">
+/// \brief Parse a module export_as declaration.<br class="">
+///<br class="">
+///   export-as-declaration:<br class="">
+///     'export_as' identifier<br class="">
+void ModuleMapParser::parseExportAs<wbr class="">Decl() {<br class="">
+  assert(<a href="http://tok.is/" target="_blank" class="">Tok.is</a>(MMToken::ExportA<wbr class="">sKeyword));<br class="">
+  consumeToken();<br class="">
+<br class="">
+  if (!<a href="http://tok.is/" target="_blank" class="">Tok.is</a>(MMToken::Identifier)) {<br class="">
+    Diags.Report(Tok.getLocation()<wbr class="">, diag::err_mmap_module_id);<br class="">
+    HadError = true;<br class="">
+    return;<br class="">
+  }<br class="">
+<br class="">
+  if (ActiveModule->Parent) {<br class="">
+    Diags.Report(Tok.getLocation()<wbr class="">, diag::err_mmap_submodule_expor<wbr class="">t_as);<br class="">
+    consumeToken();<br class="">
+    return;<br class="">
+  }<br class="">
+<br class="">
+  if (!ActiveModule->ExportAsModule<wbr class="">.empty()) {<br class="">
+    if (ActiveModule->ExportAsModule == Tok.getString()) {<br class="">
+      Diags.Report(Tok.getLocation()<wbr class="">, diag::warn_mmap_redundant_expo<wbr class="">rt_as)<br class="">
+        << ActiveModule->Name << Tok.getString();<br class="">
+    } else {<br class="">
+      Diags.Report(Tok.getLocation()<wbr class="">, diag::err_mmap_conflicting_exp<wbr class="">ort_as)<br class="">
+        << ActiveModule->Name << ActiveModule->ExportAsModule<br class="">
+        << Tok.getString();<br class="">
+    }<br class="">
+  }<br class="">
+<br class="">
+  ActiveModule->ExportAsModule = Tok.getString();<br class="">
+  consumeToken();<br class="">
+}<br class="">
+<br class="">
 /// \brief Parse a module use declaration.<br class="">
 ///<br class="">
 ///   use-declaration:<br class="">
@@ -2689,6 +2732,7 @@ bool ModuleMapParser::parseModuleMa<wbr class="">pFile<br class="">
     case MMToken::Exclaim:<br class="">
     case MMToken::ExcludeKeyword:<br class="">
     case MMToken::ExportKeyword:<br class="">
+    case MMToken::ExportAsKeyword:<br class="">
     case MMToken::HeaderKeyword:<br class="">
     case MMToken::Identifier:<br class="">
     case MMToken::LBrace:<br class="">
<br class="">
Modified: cfe/trunk/lib/Serialization/AS<wbr class="">TReader.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/lib/Serializat<wbr class="">ion/ASTReader.cpp?rev=313316&<wbr class="">r1=313315&r2=313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/Serialization/AS<wbr class="">TReader.cpp (original)<br class="">
+++ cfe/trunk/lib/Serialization/AS<wbr class="">TReader.cpp Thu Sep 14 16:38:44 2017<br class="">
@@ -5123,7 +5123,7 @@ ASTReader::ReadSubmoduleBlock(<wbr class="">ModuleFile<br class="">
       break;<br class="">
     }<br class="">
<br class="">
-    case SUBMODULE_INITIALIZERS:<br class="">
+    case SUBMODULE_INITIALIZERS: {<br class="">
       if (!ContextObj)<br class="">
         break;<br class="">
       SmallVector<uint32_t, 16> Inits;<br class="">
@@ -5132,6 +5132,11 @@ ASTReader::ReadSubmoduleBlock(<wbr class="">ModuleFile<br class="">
       ContextObj->addLazyModuleInit<wbr class="">ializers(CurrentModule, Inits);<br class="">
       break;<br class="">
     }<br class="">
+<br class="">
+    case SUBMODULE_EXPORT_AS:<br class="">
+      CurrentModule->ExportAsModule = Blob.str();<br class="">
+      break;<br class="">
+    }<br class="">
   }<br class="">
 }<br class="">
<br class="">
<br class="">
Modified: cfe/trunk/lib/Serialization/AS<wbr class="">TWriter.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=313316&r1=313315&r2=313316&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/lib/Serializat<wbr class="">ion/ASTWriter.cpp?rev=313316&<wbr class="">r1=313315&r2=313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/Serialization/AS<wbr class="">TWriter.cpp (original)<br class="">
+++ cfe/trunk/lib/Serialization/AS<wbr class="">TWriter.cpp Thu Sep 14 16:38:44 2017<br class="">
@@ -1130,6 +1130,7 @@ void ASTWriter::WriteBlockInfoBlock<wbr class="">() {<br class="">
   RECORD(SUBMODULE_TEXTUAL_HEAD<wbr class="">ER);<br class="">
   RECORD(SUBMODULE_PRIVATE_TEXT<wbr class="">UAL_HEADER);<br class="">
   RECORD(SUBMODULE_<wbr class="">INITIALIZERS);<br class="">
+  RECORD(SUBMODULE_EXPORT_AS);<br class="">
<br class="">
   // Comments Block.<br class="">
   BLOCK(COMMENTS_BLOCK);<br class="">
@@ -2791,6 +2792,12 @@ void ASTWriter::WriteSubmodules(Mod<wbr class="">ule *<br class="">
   Abbrev->Add(BitCodeAbbrevOp(B<wbr class="">itCodeAbbrevOp::Blob));    // Message<br class="">
   unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Ab<wbr class="">brev));<br class="">
<br class="">
+  Abbrev = std::make_shared<BitCodeAbbrev<wbr class="">>();<br class="">
+  Abbrev->Add(BitCodeAbbrevOp(SU<wbr class="">BMODULE_EXPORT_AS));<br class="">
+  Abbrev->Add(BitCodeAbbrevOp(Bi<wbr class="">tCodeAbbrevOp::Blob));    // Macro name<br class="">
+  unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Ab<wbr class="">brev));<br class="">
+<br class="">
+<br class="">
   // Write the submodule metadata block.<br class="">
   RecordData::value_type Record[] = {<br class="">
       getNumberOfModules(WritingMod<wbr class="">ule),<br class="">
@@ -2925,6 +2932,12 @@ void ASTWriter::WriteSubmodules(Mod<wbr class="">ule *<br class="">
     if (!Inits.empty())<br class="">
       Stream.EmitRecord(SUBMODULE_I<wbr class="">NITIALIZERS, Inits);<br class="">
<br class="">
+    // Emit the name of the re-exported module, if any.<br class="">
+    if (!Mod->ExportAsModule.empty()) {<br class="">
+      RecordData::value_type Record[] = {SUBMODULE_EXPORT_AS};<br class="">
+      Stream.EmitRecordWithBlob(Expo<wbr class="">rtAsAbbrev, Record, Mod->ExportAsModule);<br class="">
+    }<br class="">
+<br class="">
     // Queue up the submodules of this module.<br class="">
     for (auto *M : Mod->submodules())<br class="">
       Q.push(M);<br class="">
<br class="">
Added: cfe/trunk/test/Modules/Inputs/<wbr class="">export_as_test.modulemap<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/export_as_test.modulemap?rev=313316&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/test/Modules/<wbr class="">Inputs/export_as_test.modulema<wbr class="">p?rev=313316&view=auto</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/test/Modules/Inputs/<wbr class="">export_as_test.modulemap (added)<br class="">
+++ cfe/trunk/test/Modules/Inputs/<wbr class="">export_as_test.modulemap Thu Sep 14 16:38:44 2017<br class="">
@@ -0,0 +1,9 @@<br class="">
+module PrivateFoo {<br class="">
+  export_as Foo<br class="">
+  export_as Bar<br class="">
+  export_as Bar<br class="">
+<br class="">
+  module Sub {<br class="">
+    export_as Wibble<br class="">
+  }<br class="">
+}<br class="">
<br class="">
Added: cfe/trunk/test/Modules/export_<wbr class="">as_test.c<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/export_as_test.c?rev=313316&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-pr<wbr class="">oject/cfe/trunk/test/Modules/<wbr class="">export_as_test.c?rev=313316&<wbr class="">view=auto</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/test/Modules/export_<wbr class="">as_test.c (added)<br class="">
+++ cfe/trunk/test/Modules/export_<wbr class="">as_test.c Thu Sep 14 16:38:44 2017<br class="">
@@ -0,0 +1,9 @@<br class="">
+// RUN: rm -rf %t<br class="">
+// RUN: not %clang_cc1 -fmodules -fmodules-cache-path=%t -fmodule-map-file=%S/Inputs/ex<wbr class="">port_as_test.modulemap %s 2> %t.err<br class="">
+// RUN: FileCheck %s < %t.err<br class="">
+<br class="">
+// CHECK: export_as_test.modulemap:3:13: error: conflicting re-export of module 'PrivateFoo' as 'Foo' or 'Bar'<br class="">
+// CHECK: export_as_test.modulemap:4:13: warning: module 'PrivateFoo' already re-exported as 'Bar'<br class="">
+// CHECK: export_as_test.modulemap:7:15: error: only top-level modules can be re-exported as public<br class="">
+<br class="">
+<br class="">
<br class="">
<br class="">
______________________________<wbr class="">_________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></div></div><br class="">______________________________<wbr class="">_________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/cfe-commits</a><br class="">
<br class=""></blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></body></html>