Skip to content
Snippets Groups Projects
Commit 118076d1 authored by Richard Smith's avatar Richard Smith
Browse files

[modules] This check is run before we resolve the header, not after, so just

check that private headers are in a list matching the role. (We can't perform
the opposite checks for non-private headers because we infer those.)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231728 91177308-0d34-0410-b5e6-96231b3b80d8
parent e32a6119
No related branches found
No related tags found
No related merge requests found
......@@ -219,28 +219,21 @@ static bool violatesPrivateInclude(Module *RequestingModule,
Module *RequestedModule) {
bool IsPrivateRole = Role & ModuleMap::PrivateHeader;
#ifndef NDEBUG
// 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.
auto IsInHeaderList = [&](std::initializer_list<SmallVectorImpl<
Module::Header>*> HeaderList) -> bool {
for (auto *Hs : HeaderList) {
if (std::find_if(Hs->begin(), Hs->end(), [&](const Module::Header &H) {
if (IsPrivateRole) {
// 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]};
for (auto *Hs : HeaderList)
IsPrivate |=
std::find_if(Hs->begin(), Hs->end(), [&](const Module::Header &H) {
return H.Entry == IncFileEnt;
}) != Hs->end())
return true;
}
return false;
};
// If a header is both public and private, then it's available as a public
// header and that's OK.
// FIXME: Should we reject this when parsing the module map?
bool IsPrivate =
IsInHeaderList({&RequestedModule->Headers[Module::HK_Private],
&RequestedModule->Headers[Module::HK_PrivateTextual]}) &&
!IsInHeaderList({&RequestedModule->Headers[Module::HK_Normal],
&RequestedModule->Headers[Module::HK_Textual]});
assert(IsPrivate == IsPrivateRole && "inconsistent headers and roles");
}) != Hs->end();
assert((!IsPrivateRole || IsPrivate) && "inconsistent headers and roles");
}
#endif
return IsPrivateRole &&
RequestedModule->getTopLevelModule() != RequestingModule;
......
// RUN: %clang_cc1 -fmodules -fmodule-map-file=%s -I%S -include "Inputs/empty.h" /dev/null
module Blah {
// RUN: %clang_cc1 -fmodules -fmodule-map-file=%s -I%S -include "Inputs/dummy.h" /dev/null
module A {
header "Inputs/empty.h"
private header "Inputs/empty.h"
}
module B {
private header "Inputs/dummy.h"
header "Inputs/dummy.h"
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment