From: Ben Langmuir Date: Mon, 5 May 2014 05:31:33 +0000 (+0000) Subject: Make module self-import an error X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=917eddeac502213fc3d19eae90e2c8ae5820311e;p=clang Make module self-import an error Ideally, importing Foo.a from Foo.b would "do the right thing", but until it does, this patch makes it an error rather than allow it to silently be ignored. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207948 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index f46e08340c..7c4f988353 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -6990,6 +6990,8 @@ def note_module_import_in_extern_c : Note< def err_module_import_not_at_top_level : Error< "import of module '%0' appears within %1">; def note_module_import_not_at_top_level : Note<"%0 begins here">; +def err_module_self_import : Error< + "import of module '%0' appears within same top-level module '%1'">; } let CategoryName = "Documentation Issue" in { diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 76301f2a44..d7b526b2da 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -1164,7 +1164,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, Module = Known->second; } else if (ModuleName == getLangOpts().CurrentModule) { // This is the module we're building. - Module = PP->getHeaderSearchInfo().getModuleMap().findModule(ModuleName); + Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; } else { // Search for a module with the given name. diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 743a8f2943..3ee1577b0b 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -13142,6 +13142,13 @@ DeclResult Sema::ActOnModuleImport(SourceLocation AtLoc, checkModuleImportContext(*this, Mod, ImportLoc, CurContext); + // FIXME: we should support importing a submodule within a different submodule + // of the same top-level module. Until we do, make it an error rather than + // silently ignoring the import. + if (Mod->getTopLevelModuleName() == getLangOpts().CurrentModule) + Diag(ImportLoc, diag::err_module_self_import) + << Mod->getFullModuleName() << getLangOpts().CurrentModule; + SmallVector IdentifierLocs; Module *ModCheck = Mod; for (unsigned I = 0, N = Path.size(); I != N; ++I) { diff --git a/test/Modules/import-self.m b/test/Modules/import-self.m new file mode 100644 index 0000000000..68be565eaf --- /dev/null +++ b/test/Modules/import-self.m @@ -0,0 +1,11 @@ +// RUN: rm -rf %t +// RUN: not %clang_cc1 -fmodules -fmodules-cache-path=%t \ +// RUN: -I %S/Inputs/submodules %s 2>&1 | FileCheck %s +// CHECK: import of module 'import_self.c' appears within same top-level module 'import_self' + +// RUN: not %clang_cc1 -fmodules -fmodules-cache-path=%t \ +// RUN: -I %S/Inputs/submodules -fmodule-name=import_self %s \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-fmodule-name %s +// CHECK-fmodule-name: import of module 'import_self.b' appears within same top-level module 'import_self' + +@import import_self.b; diff --git a/test/Modules/submodules.cpp b/test/Modules/submodules.cpp index 7ef785c936..c3b2623016 100644 --- a/test/Modules/submodules.cpp +++ b/test/Modules/submodules.cpp @@ -26,9 +26,3 @@ hash_map ints_to_floats; // expected-error{{declaration of 'hash_map @import std.hash_map; hash_map 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; -extern MyTypeD import_self_test_d;