[modules] Don't assert if the same header is named as both a public and a

private header within the same module.

llvm-svn: 231725
This commit is contained in:
Richard Smith 2015-03-09 23:46:50 +00:00
parent 3197fb4a89
commit 00bc95ec9a
3 changed files with 23 additions and 9 deletions

View File

@ -222,15 +222,24 @@ static bool violatesPrivateInclude(Module *RequestingModule,
// 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 *Hdrs : HeaderList)
IsPrivate |=
std::find_if(Hdrs->begin(), Hdrs->end(), [&](const Module::Header &H) {
return H.Entry == IncFileEnt;
}) != Hdrs->end();
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) {
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");
#endif
return IsPrivateRole &&

View File

View File

@ -0,0 +1,5 @@
// RUN: %clang_cc1 -fmodules -fmodule-map-file=%s -I%S -include "Inputs/empty.h" /dev/null
module Blah {
header "Inputs/empty.h"
private header "Inputs/empty.h"
}