<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 1:45 PM, Galina Kistanova <<a href="mailto:gkistanova@gmail.com" class="">gkistanova@gmail.com</a>> wrote:</div><br class="Apple-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" class="">http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/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><br class=""></div>I’m unable to reproduce this issue, and it’s weirdly not hitting the other bots.</div><div><br class=""></div><div>Is anyone able to reproduce this? The stack trace is… insufficient… to figure out what’s going on.</div><div><br class=""></div><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=""><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-<wbr class="">project?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 href="rdar://problem/34438420" 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/<wbr class="">Serialization/ASTBitCodes.h<br class="">
    cfe/trunk/lib/Basic/Module.cpp<br class="">
    cfe/trunk/lib/Lex/ModuleMap.<wbr class="">cpp<br class="">
    cfe/trunk/lib/Serialization/<wbr class="">ASTReader.cpp<br class="">
    cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.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-<wbr class="">project/cfe/trunk/docs/<wbr class="">Modules.rst?rev=313316&r1=<wbr class="">313315&r2=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-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Basic/<wbr class="">DiagnosticLexKinds.td?rev=<wbr class="">313316&r1=313315&r2=313316&<wbr class="">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_<wbr class="">attribute_va<br class="">
   "expected integer literal as value for header attribute '%0'">;<br class="">
 def err_mmap_expected_header_<wbr class="">attribute : 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|<wbr class="">include_next|__include_macros}<wbr class="">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-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Basic/Module.h?rev=<wbr class="">313316&r1=313315&r2=313316&<wbr class="">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/<wbr class="">Serialization/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-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Serialization/<wbr class="">ASTBitCodes.h?rev=313316&r1=<wbr class="">313315&r2=313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/include/clang/<wbr class="">Serialization/ASTBitCodes.h (original)<br class="">
+++ cfe/trunk/include/clang/<wbr class="">Serialization/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-<wbr class="">project/cfe/trunk/lib/Basic/<wbr class="">Module.cpp?rev=313316&r1=<wbr class="">313315&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.<wbr class="">cpp<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-<wbr class="">project/cfe/trunk/lib/Lex/<wbr class="">ModuleMap.cpp?rev=313316&r1=<wbr class="">313315&r2=313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/Lex/ModuleMap.<wbr class="">cpp (original)<br class="">
+++ cfe/trunk/lib/Lex/ModuleMap.<wbr class="">cpp 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(<wbr class="">SourceLocation 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::<wbr class="">parseModuleDecl()<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::<wbr class="">parseExportDecl()<br class="">
   ActiveModule-><wbr class="">UnresolvedExports.push_back(<wbr class="">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::<wbr class="">parseExportAsDecl() {<br class="">
+  assert(<a href="http://Tok.is" class="">Tok.is</a>(MMToken::<wbr class="">ExportAsKeyword));<br class="">
+  consumeToken();<br class="">
+<br class="">
+  if (!<a href="http://Tok.is" 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_<wbr class="">export_as);<br class="">
+    consumeToken();<br class="">
+    return;<br class="">
+  }<br class="">
+<br class="">
+  if (!ActiveModule-><wbr class="">ExportAsModule.empty()) {<br class="">
+    if (ActiveModule->ExportAsModule == Tok.getString()) {<br class="">
+      Diags.Report(Tok.getLocation()<wbr class="">, diag::warn_mmap_redundant_<wbr class="">export_as)<br class="">
+        << ActiveModule->Name << Tok.getString();<br class="">
+    } else {<br class="">
+      Diags.Report(Tok.getLocation()<wbr class="">, diag::err_mmap_conflicting_<wbr class="">export_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::<wbr class="">parseModuleMapFile<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/<wbr class="">ASTReader.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-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTReader.cpp?<wbr class="">rev=313316&r1=313315&r2=<wbr class="">313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/Serialization/<wbr class="">ASTReader.cpp (original)<br class="">
+++ cfe/trunk/lib/Serialization/<wbr class="">ASTReader.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-><wbr class="">addLazyModuleInitializers(<wbr class="">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/<wbr class="">ASTWriter.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-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTWriter.cpp?<wbr class="">rev=313316&r1=313315&r2=<wbr class="">313316&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp (original)<br class="">
+++ cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp Thu Sep 14 16:38:44 2017<br class="">
@@ -1130,6 +1130,7 @@ void ASTWriter::<wbr class="">WriteBlockInfoBlock() {<br class="">
   RECORD(SUBMODULE_TEXTUAL_<wbr class="">HEADER);<br class="">
   RECORD(SUBMODULE_PRIVATE_<wbr class="">TEXTUAL_HEADER);<br class="">
   RECORD(SUBMODULE_INITIALIZERS)<wbr class="">;<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(<wbr class="">Module *<br class="">
   Abbrev->Add(BitCodeAbbrevOp(<wbr class="">BitCodeAbbrevOp::Blob));    // Message<br class="">
   unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(<wbr class="">Abbrev));<br class="">
<br class="">
+  Abbrev = std::make_shared<<wbr class="">BitCodeAbbrev>();<br class="">
+  Abbrev->Add(BitCodeAbbrevOp(<wbr class="">SUBMODULE_EXPORT_AS));<br class="">
+  Abbrev->Add(BitCodeAbbrevOp(<wbr class="">BitCodeAbbrevOp::Blob));    // Macro name<br class="">
+  unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(<wbr class="">Abbrev));<br class="">
+<br class="">
+<br class="">
   // Write the submodule metadata block.<br class="">
   RecordData::value_type Record[] = {<br class="">
       getNumberOfModules(<wbr class="">WritingModule),<br class="">
@@ -2925,6 +2932,12 @@ void ASTWriter::WriteSubmodules(<wbr class="">Module *<br class="">
     if (!Inits.empty())<br class="">
       Stream.EmitRecord(SUBMODULE_<wbr class="">INITIALIZERS, 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(<wbr class="">ExportAsAbbrev, 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-<wbr class="">project/cfe/trunk/test/<wbr class="">Modules/Inputs/export_as_test.<wbr class="">modulemap?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-<wbr class="">project/cfe/trunk/test/<wbr class="">Modules/export_as_test.c?rev=<wbr class="">313316&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/<wbr class="">export_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" 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=""></body></html>