<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>