diff --git a/lib/Basic/Module.cpp b/lib/Basic/Module.cpp index baeeb9edbddf8455527d8d59b22dbb2992043f56..e119c0535eb232b3263d08e8e999de57f1101741 100644 --- a/lib/Basic/Module.cpp +++ b/lib/Basic/Module.cpp @@ -492,6 +492,7 @@ LLVM_DUMP_METHOD void Module::dump() const { void VisibleModuleSet::setVisible(Module *M, SourceLocation Loc, VisibleCallback Vis, ConflictCallback Cb) { + assert(Loc.isValid() && "setVisible expects a valid import location"); if (isVisible(M)) return; diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 1c62b4e57b0bf8b14d61805b0ef6700ba8cc168e..b2f59d1fa6c91601452387be3571506eddd1af57 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -4062,7 +4062,9 @@ void ASTReader::InitializeContext() { if (Module *Imported = getSubmodule(Import.ID)) { makeModuleVisible(Imported, Module::AllVisible, /*ImportLoc=*/Import.ImportLoc); - PP.makeModuleVisible(Imported, Import.ImportLoc); + if (Import.ImportLoc.isValid()) + PP.makeModuleVisible(Imported, Import.ImportLoc); + // FIXME: should we tell Sema to make the module visible too? } } ImportedModules.clear(); diff --git a/test/Index/Inputs/module.map b/test/Index/Inputs/module.map index 4bfc109a8b1361e5790360c4620e1ceff0e9b427..10712accb1c247fa05c4437a953ab31950dadbe3 100644 --- a/test/Index/Inputs/module.map +++ b/test/Index/Inputs/module.map @@ -6,3 +6,17 @@ module ModuleNeedsVFS { framework module * { } module ModuleUndef { header "module-undef.h" } + +module PreambleWithImplicitImport { + module A { + header "preamble-with-implicit-import-A.h" + } + module B { + header "preamble-with-implicit-import-B.h" + export * + } + module C { + header "preamble-with-implicit-import-C.h" + export * + } +} diff --git a/test/Index/Inputs/preamble-with-implicit-import-A.h b/test/Index/Inputs/preamble-with-implicit-import-A.h new file mode 100644 index 0000000000000000000000000000000000000000..c68390159094aa22e2f2c0c8f2997da7f107af06 --- /dev/null +++ b/test/Index/Inputs/preamble-with-implicit-import-A.h @@ -0,0 +1 @@ +// preamble-with-implicit-import-A diff --git a/test/Index/Inputs/preamble-with-implicit-import-B.h b/test/Index/Inputs/preamble-with-implicit-import-B.h new file mode 100644 index 0000000000000000000000000000000000000000..17c138dfb5aa4f9bd70b6be56deed1a2fafb4f77 --- /dev/null +++ b/test/Index/Inputs/preamble-with-implicit-import-B.h @@ -0,0 +1,3 @@ +#pragma once +#include "preamble-with-implicit-import-C.h" // Circular +typedef struct { char x; } Typo; diff --git a/test/Index/Inputs/preamble-with-implicit-import-C.h b/test/Index/Inputs/preamble-with-implicit-import-C.h new file mode 100644 index 0000000000000000000000000000000000000000..a3fc1d4fea06cb24d800f499a1538bcaea536bd8 --- /dev/null +++ b/test/Index/Inputs/preamble-with-implicit-import-C.h @@ -0,0 +1,2 @@ +#pragma once +#include "preamble-with-implicit-import-B.h" // Circular diff --git a/test/Index/Inputs/preamble-with-implicit-import.h b/test/Index/Inputs/preamble-with-implicit-import.h new file mode 100644 index 0000000000000000000000000000000000000000..1b429678f21350822bb33d52c18b2dfabd9c5159 --- /dev/null +++ b/test/Index/Inputs/preamble-with-implicit-import.h @@ -0,0 +1,4 @@ +#include "preamble-with-implicit-import-A.h" + +// Typo is defined in B, which is not imported. +void useTypeFromB(Typo *); diff --git a/test/Index/preamble-with-implicit-import.m b/test/Index/preamble-with-implicit-import.m new file mode 100644 index 0000000000000000000000000000000000000000..e3d0e8b1a62bc769005a694f7ecf9af6beba8c04 --- /dev/null +++ b/test/Index/preamble-with-implicit-import.m @@ -0,0 +1,6 @@ +// RUN: rm -rf %t +// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 2 none %s -I %S/Inputs -fmodules -fmodules-cache-path=%t -fspell-checking 2>&1 | FileCheck %s +// CHECK: error: declaration of 'Typo' must be imported +// CHECK: error: declaration of 'Typo' must be imported + +#include "preamble-with-implicit-import.h"