]> granicus.if.org Git - clang/commitdiff
Make module self-import an error
authorBen Langmuir <blangmuir@apple.com>
Mon, 5 May 2014 05:31:33 +0000 (05:31 +0000)
committerBen Langmuir <blangmuir@apple.com>
Mon, 5 May 2014 05:31:33 +0000 (05:31 +0000)
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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Frontend/CompilerInstance.cpp
lib/Sema/SemaDecl.cpp
test/Modules/import-self.m [new file with mode: 0644]
test/Modules/submodules.cpp

index f46e08340cb6a5bc694175bf924c8678a33587a9..7c4f9883538e04c75bd6ee0c5ca3c97b5836ef2e 100644 (file)
@@ -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 {
index 76301f2a44e50e0e362bdfcf1038479f53144462..d7b526b2da2660aca3cc371c4e649da9427b968c 100644 (file)
@@ -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.
index 743a8f29439de2a96f8bbacfaeab9a1b98e1b65a..3ee1577b0ba7b2babe9c877039f9e110683a01ef 100644 (file)
@@ -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<SourceLocation, 2> 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 (file)
index 0000000..68be565
--- /dev/null
@@ -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;
index 7ef785c936c4f6ad6acd915c2bf9938620bb984d..c3b2623016a8fe25135b461242ca4ab276aef3fb 100644 (file)
@@ -26,9 +26,3 @@ hash_map<int, float> ints_to_floats; // expected-error{{declaration of 'hash_map
 @import std.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;
-extern MyTypeD import_self_test_d;