diff options
author | Ben Langmuir <blangmuir@apple.com> | 2014-04-23 21:10:46 +0000 |
---|---|---|
committer | Ben Langmuir <blangmuir@apple.com> | 2014-04-23 21:10:46 +0000 |
commit | 1cd8e7dad6c61280604722593ad3d36a017f7851 (patch) | |
tree | bb8137285611a51a746ae2bb75cdc39360deb2da | |
parent | f035b1e0f6b37a2abe56ab36d2ac8683d845bf6a (diff) | |
download | clang-1cd8e7dad6c61280604722593ad3d36a017f7851.tar.gz clang-1cd8e7dad6c61280604722593ad3d36a017f7851.tar.bz2 clang-1cd8e7dad6c61280604722593ad3d36a017f7851.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207024 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/Module.h | 3 | ||||
-rw-r--r-- | lib/Basic/Module.cpp | 10 | ||||
-rw-r--r-- | lib/Lex/ModuleMap.cpp | 2 | ||||
-rw-r--r-- | test/Modules/missing-submodule.m | 7 |
4 files changed, 18 insertions, 4 deletions
diff --git a/include/clang/Basic/Module.h b/include/clang/Basic/Module.h index 92de93a4d4..783aa1d57b 100644 --- a/include/clang/Basic/Module.h +++ b/include/clang/Basic/Module.h @@ -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. /// diff --git a/lib/Basic/Module.cpp b/lib/Basic/Module.cpp index 067528abac..e75485dbd6 100644 --- a/lib/Basic/Module.cpp +++ b/lib/Basic/Module.cpp @@ -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); diff --git a/lib/Lex/ModuleMap.cpp b/lib/Lex/ModuleMap.cpp index 068e16d043..39c1121011 100644 --- a/lib/Lex/ModuleMap.cpp +++ b/lib/Lex/ModuleMap.cpp @@ -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 diff --git a/test/Modules/missing-submodule.m b/test/Modules/missing-submodule.m new file mode 100644 index 0000000000..4f3553ce6c --- /dev/null +++ b/test/Modules/missing-submodule.m @@ -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; +} |