r194018 - Include non-explicit submodules in exported module list
Dmitri Gribenko
gribozavr at gmail.com
Mon Nov 4 13:51:33 PST 2013
Author: gribozavr
Date: Mon Nov 4 15:51:33 2013
New Revision: 194018
URL: http://llvm.org/viewvc/llvm-project?rev=194018&view=rev
Log:
Include non-explicit submodules in exported module list
This change fixes Richard's testcase for r193815. Now we include non-explicit
submodules into the list of exports.
The test failed previously because:
- recursive_visibility_a1.inner is not imported (only recursive_visibility_a1 is),
- thus the 'inner' submodule is not showing up in any of the import lists,
- and because of this getExportedModules() is not returning the
correct module set -- it only considers modules that are imported.
The fix is to make Module::getExportedModules() include non-explicit submodules
into the list of exports.
Added:
cfe/trunk/test/Modules/Inputs/recursive_visibility_a1_inner.h
cfe/trunk/test/Modules/Inputs/recursive_visibility_a2_more_inner.h
cfe/trunk/test/Modules/Inputs/recursive_visibility_b.h
cfe/trunk/test/Modules/Inputs/recursive_visibility_c.h
cfe/trunk/test/Modules/recursive_visibility.mm
Modified:
cfe/trunk/lib/Basic/Module.cpp
cfe/trunk/lib/Serialization/ASTReader.cpp
cfe/trunk/test/Modules/Inputs/module.map
Modified: cfe/trunk/lib/Basic/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=194018&r1=194017&r2=194018&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/Module.cpp (original)
+++ cfe/trunk/lib/Basic/Module.cpp Mon Nov 4 15:51:33 2013
@@ -194,6 +194,16 @@ static void printModuleId(raw_ostream &O
}
void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const {
+ // All non-explicit submodules are exported.
+ for (std::vector<Module *>::const_iterator I = SubModules.begin(),
+ E = SubModules.end();
+ I != E; ++I) {
+ Module *Mod = *I;
+ if (!Mod->IsExplicit)
+ Exported.push_back(Mod);
+ }
+
+ // Find re-exported modules by filtering the list of imported modules.
bool AnyWildcard = false;
bool UnrestrictedWildcard = false;
SmallVector<Module *, 4> WildcardRestrictions;
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=194018&r1=194017&r2=194018&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon Nov 4 15:51:33 2013
@@ -2845,16 +2845,7 @@ void ASTReader::makeModuleVisible(Module
makeNamesVisible(Hidden->second, Hidden->first);
HiddenNamesMap.erase(Hidden);
}
-
- // Push any non-explicit submodules onto the stack to be marked as
- // visible.
- for (Module::submodule_iterator Sub = Mod->submodule_begin(),
- SubEnd = Mod->submodule_end();
- Sub != SubEnd; ++Sub) {
- if (!(*Sub)->IsExplicit && Visited.insert(*Sub))
- Stack.push_back(*Sub);
- }
-
+
// Push any exported modules onto the stack to be marked as visible.
SmallVector<Module *, 16> Exports;
Mod->getExportedModules(Exports);
Modified: cfe/trunk/test/Modules/Inputs/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=194018&r1=194017&r2=194018&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/module.map (original)
+++ cfe/trunk/test/Modules/Inputs/module.map Mon Nov 4 15:51:33 2013
@@ -263,3 +263,21 @@ module using_decl {
module a { header "using-decl-a.h" export * }
module b { header "using-decl-b.h" export * }
}
+
+module recursive_visibility_a1 {
+ module inner { header "recursive_visibility_a1_inner.h" }
+}
+module recursive_visibility_a2 {
+ module inner {
+ module more_inner {
+ header "recursive_visibility_a2_more_inner.h"
+ }
+ }
+}
+module recursive_visibility_b {
+ header "recursive_visibility_b.h"
+ export *
+}
+module recursive_visibility_c {
+ header "recursive_visibility_c.h"
+}
Added: cfe/trunk/test/Modules/Inputs/recursive_visibility_a1_inner.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive_visibility_a1_inner.h?rev=194018&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/recursive_visibility_a1_inner.h (added)
+++ cfe/trunk/test/Modules/Inputs/recursive_visibility_a1_inner.h Mon Nov 4 15:51:33 2013
@@ -0,0 +1,4 @@
+namespace A1_Inner {
+ struct X {};
+ void f(X);
+}
Added: cfe/trunk/test/Modules/Inputs/recursive_visibility_a2_more_inner.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive_visibility_a2_more_inner.h?rev=194018&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/recursive_visibility_a2_more_inner.h (added)
+++ cfe/trunk/test/Modules/Inputs/recursive_visibility_a2_more_inner.h Mon Nov 4 15:51:33 2013
@@ -0,0 +1,4 @@
+namespace A2_More_Inner {
+ struct X {};
+ void f(X);
+}
Added: cfe/trunk/test/Modules/Inputs/recursive_visibility_b.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive_visibility_b.h?rev=194018&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/recursive_visibility_b.h (added)
+++ cfe/trunk/test/Modules/Inputs/recursive_visibility_b.h Mon Nov 4 15:51:33 2013
@@ -0,0 +1,2 @@
+ at import recursive_visibility_a1.inner;
+ at import recursive_visibility_a2;
Added: cfe/trunk/test/Modules/Inputs/recursive_visibility_c.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive_visibility_c.h?rev=194018&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/recursive_visibility_c.h (added)
+++ cfe/trunk/test/Modules/Inputs/recursive_visibility_c.h Mon Nov 4 15:51:33 2013
@@ -0,0 +1,5 @@
+ at import recursive_visibility_b;
+template<template<typename T> class Y> void g() {
+ f(typename Y<A1_Inner::X>::type{});
+ f(typename Y<A2_More_Inner::X>::type{});
+}
Added: cfe/trunk/test/Modules/recursive_visibility.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/recursive_visibility.mm?rev=194018&view=auto
==============================================================================
--- cfe/trunk/test/Modules/recursive_visibility.mm (added)
+++ cfe/trunk/test/Modules/recursive_visibility.mm Mon Nov 4 15:51:33 2013
@@ -0,0 +1,9 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodules-cache-path=%t -I %S/Inputs %s -verify -std=c++11
+
+// expected-no-diagnostics
+
+ at import recursive_visibility_c;
+
+template<typename T> struct Z { typedef T type; };
+template void g<Z>();
More information about the cfe-commits
mailing list