forked from OSchip/llvm-project
Do not print inferred submodules explicitly in __inferred_module.map
Otherwise including a header in your source file that is not included by framework's umbrella header will silently add an empty submodule with that name. is automatically translated to @import Foo.NotInModule; which then would have succeeded because the inferred module map contained an empty submodule called NotInModule. llvm-svn: 207024
This commit is contained in:
parent
4dbd4891c7
commit
ffbafa2af0
|
@ -150,6 +150,9 @@ public:
|
|||
/// imported within such a block).
|
||||
unsigned IsExternC : 1;
|
||||
|
||||
/// \brief Whether this is an inferred submodule (module * { ... }).
|
||||
unsigned IsInferred : 1;
|
||||
|
||||
/// \brief Whether we should infer submodules for this module based on
|
||||
/// the headers.
|
||||
///
|
||||
|
|
|
@ -29,9 +29,10 @@ Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent,
|
|||
: Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), ModuleMap(File),
|
||||
Umbrella(), ASTFile(0), IsMissingRequirement(false), IsAvailable(true),
|
||||
IsFromModuleFile(false), IsFramework(IsFramework), IsExplicit(IsExplicit),
|
||||
IsSystem(false), IsExternC(false), InferSubmodules(false),
|
||||
InferExplicitSubmodules(false), InferExportWildcard(false),
|
||||
ConfigMacrosExhaustive(false), NameVisibility(Hidden) {
|
||||
IsSystem(false), IsExternC(false), IsInferred(false),
|
||||
InferSubmodules(false), InferExplicitSubmodules(false),
|
||||
InferExportWildcard(false), ConfigMacrosExhaustive(false),
|
||||
NameVisibility(Hidden) {
|
||||
if (Parent) {
|
||||
if (!Parent->isAvailable())
|
||||
IsAvailable = false;
|
||||
|
@ -360,7 +361,8 @@ void Module::print(raw_ostream &OS, unsigned Indent) const {
|
|||
|
||||
for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end();
|
||||
MI != MIEnd; ++MI)
|
||||
(*MI)->print(OS, Indent + 2);
|
||||
if (!(*MI)->IsInferred)
|
||||
(*MI)->print(OS, Indent + 2);
|
||||
|
||||
for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
|
||||
OS.indent(Indent + 2);
|
||||
|
|
|
@ -365,6 +365,7 @@ ModuleMap::findModuleForHeader(const FileEntry *File,
|
|||
llvm::sys::path::stem(SkippedDirs[I-1]->getName()), NameBuf);
|
||||
Result = findOrCreateModule(Name, Result, UmbrellaModule->ModuleMap,
|
||||
/*IsFramework=*/false, Explicit).first;
|
||||
Result->IsInferred = true;
|
||||
|
||||
// Associate the module and the directory.
|
||||
UmbrellaDirs[SkippedDirs[I-1]] = Result;
|
||||
|
@ -381,6 +382,7 @@ ModuleMap::findModuleForHeader(const FileEntry *File,
|
|||
llvm::sys::path::stem(File->getName()), NameBuf);
|
||||
Result = findOrCreateModule(Name, Result, UmbrellaModule->ModuleMap,
|
||||
/*IsFramework=*/false, Explicit).first;
|
||||
Result->IsInferred = true;
|
||||
Result->addTopHeader(File);
|
||||
|
||||
// If inferred submodules export everything they import, add a
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: rm -rf %t
|
||||
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -F %S/Inputs %s -verify
|
||||
#include <Module/NotInModule.h> // expected-warning{{missing submodule 'Module.NotInModule'}}
|
||||
|
||||
int getNotInModule() {
|
||||
return not_in_module;
|
||||
}
|
Loading…
Reference in New Issue