Fix crash if a submodule @imports another submodule from the same module. The

test also adds FIXMEs for a number of places where imports and includes of
submodules don't work very well.

llvm-svn: 193005
This commit is contained in:
Richard Smith 2013-10-18 22:48:20 +00:00
parent c064a9abff
commit 92304e0013
7 changed files with 33 additions and 6 deletions

View File

@ -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);

View File

@ -0,0 +1 @@
typedef int MyTypeA;

View File

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

View File

@ -0,0 +1 @@
typedef int MyTypeC;

View File

@ -0,0 +1 @@
typedef int MyTypeD;

View File

@ -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" }
}

View File

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