[modules] When diagnosing a missing module import, suggest adding a #include if

the current language doesn't have an import syntax and we can figure out a
suitable file to include.

llvm-svn: 267802
This commit is contained in:
Richard Smith
2016-04-27 21:57:05 +00:00
parent 575ad8c2e1
commit 4eb8393c63
26 changed files with 237 additions and 15 deletions

View File

@@ -209,29 +209,25 @@ ModuleMap::findHeaderInUmbrellaDirs(const FileEntry *File,
static bool violatesPrivateInclude(Module *RequestingModule,
const FileEntry *IncFileEnt,
ModuleMap::ModuleHeaderRole Role,
Module *RequestedModule) {
bool IsPrivateRole = Role & ModuleMap::PrivateHeader;
ModuleMap::KnownHeader Header) {
#ifndef NDEBUG
if (IsPrivateRole) {
if (Header.getRole() & ModuleMap::PrivateHeader) {
// Check for consistency between the module header role
// as obtained from the lookup and as obtained from the module.
// This check is not cheap, so enable it only for debugging.
bool IsPrivate = false;
SmallVectorImpl<Module::Header> *HeaderList[] = {
&RequestedModule->Headers[Module::HK_Private],
&RequestedModule->Headers[Module::HK_PrivateTextual]};
&Header.getModule()->Headers[Module::HK_Private],
&Header.getModule()->Headers[Module::HK_PrivateTextual]};
for (auto *Hs : HeaderList)
IsPrivate |=
std::find_if(Hs->begin(), Hs->end(), [&](const Module::Header &H) {
return H.Entry == IncFileEnt;
}) != Hs->end();
assert((!IsPrivateRole || IsPrivate) && "inconsistent headers and roles");
assert(IsPrivate && "inconsistent headers and roles");
}
#endif
return IsPrivateRole && (!RequestingModule ||
RequestedModule->getTopLevelModule() !=
RequestingModule->getTopLevelModule());
return !Header.isAccessibleFrom(RequestingModule);
}
static Module *getTopLevelOrNull(Module *M) {
@@ -259,8 +255,7 @@ void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule,
if (Known != Headers.end()) {
for (const KnownHeader &Header : Known->second) {
// Remember private headers for later printing of a diagnostic.
if (violatesPrivateInclude(RequestingModule, File, Header.getRole(),
Header.getModule())) {
if (violatesPrivateInclude(RequestingModule, File, Header)) {
Private = Header.getModule();
continue;
}