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