diff options
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 12 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/submodules/import-self-a.h | 1 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/submodules/import-self-b.h | 10 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/submodules/import-self-c.h | 1 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/submodules/import-self-d.h | 1 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/submodules/module.map | 7 | ||||
-rw-r--r-- | clang/test/Modules/submodules.cpp | 7 |
7 files changed, 33 insertions, 6 deletions
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 7c5ca012726..9f0ca3b31e9 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -1108,23 +1108,23 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective) { + // Determine what file we're searching from. + StringRef ModuleName = Path[0].first->getName(); + SourceLocation ModuleNameLoc = Path[0].second; + // If we've already handled this import, just return the cached result. // This one-element cache is important to eliminate redundant diagnostics // when both the preprocessor and parser see the same import declaration. if (!ImportLoc.isInvalid() && LastModuleImportLoc == ImportLoc) { // Make the named module visible. - if (LastModuleImportResult) + if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule) ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility, ImportLoc, /*Complain=*/false); return LastModuleImportResult; } - - // Determine what file we're searching from. - StringRef ModuleName = Path[0].first->getName(); - SourceLocation ModuleNameLoc = Path[0].second; clang::Module *Module = 0; - + // If we don't already have information on this module, load the module now. llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known = KnownModules.find(Path[0].first); diff --git a/clang/test/Modules/Inputs/submodules/import-self-a.h b/clang/test/Modules/Inputs/submodules/import-self-a.h new file mode 100644 index 00000000000..adb070abf36 --- /dev/null +++ b/clang/test/Modules/Inputs/submodules/import-self-a.h @@ -0,0 +1 @@ +typedef int MyTypeA; diff --git a/clang/test/Modules/Inputs/submodules/import-self-b.h b/clang/test/Modules/Inputs/submodules/import-self-b.h new file mode 100644 index 00000000000..f88b56d5f08 --- /dev/null +++ b/clang/test/Modules/Inputs/submodules/import-self-b.h @@ -0,0 +1,10 @@ +@import import_self.c; +#include "import-self-d.h" + +// FIXME: This should not work; names from 'a' should not be visible here. +MyTypeA import_self_test_a; + +// FIXME: This should work but does not; names from 'b' are not actually visible here. +//MyTypeC import_self_test_c; + +MyTypeD import_self_test_d; diff --git a/clang/test/Modules/Inputs/submodules/import-self-c.h b/clang/test/Modules/Inputs/submodules/import-self-c.h new file mode 100644 index 00000000000..f4b86c5656e --- /dev/null +++ b/clang/test/Modules/Inputs/submodules/import-self-c.h @@ -0,0 +1 @@ +typedef int MyTypeC; diff --git a/clang/test/Modules/Inputs/submodules/import-self-d.h b/clang/test/Modules/Inputs/submodules/import-self-d.h new file mode 100644 index 00000000000..e32a6f51957 --- /dev/null +++ b/clang/test/Modules/Inputs/submodules/import-self-d.h @@ -0,0 +1 @@ +typedef int MyTypeD; diff --git a/clang/test/Modules/Inputs/submodules/module.map b/clang/test/Modules/Inputs/submodules/module.map index 16cedac231e..c91e94f47d2 100644 --- a/clang/test/Modules/Inputs/submodules/module.map +++ b/clang/test/Modules/Inputs/submodules/module.map @@ -3,3 +3,10 @@ module std { module type_traits { header "type_traits.h" } explicit module hash_map { header "hash_map.h" } } + +module import_self { + module a { header "import-self-a.h" } + module b { header "import-self-b.h" export * } + module c { header "import-self-c.h" } + module d { header "import-self-d.h" } +} diff --git a/clang/test/Modules/submodules.cpp b/clang/test/Modules/submodules.cpp index c653dddbbb5..9c62389eadc 100644 --- a/clang/test/Modules/submodules.cpp +++ b/clang/test/Modules/submodules.cpp @@ -27,3 +27,10 @@ hash_map<int, float> ints_to_floats; // expected-error{{declaration of 'hash_map hash_map<int, float> ints_to_floats2; +@import import_self.b; +extern MyTypeA import_self_test_a; // expected-error {{must be imported from module 'import_self.a'}} +// expected-note@import-self-a.h:1 {{here}} +extern MyTypeC import_self_test_c; +// FIXME: This should be valid; import_self.b re-exports import_self.d. +extern MyTypeD import_self_test_d; // expected-error {{must be imported from module 'import_self.d'}} +// expected-note@import-self-d.h:1 {{here}} |