diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-03-09 23:46:50 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-03-09 23:46:50 +0000 |
commit | 00bc95ec9a7b373baaf8f36f55f8022a59f4fb8b (patch) | |
tree | 272cec25fa09eb27468e7c013e493077f5fa8e38 | |
parent | 3197fb4a89dc9cddb23ad4298e6121354f1d488b (diff) | |
download | bcm5719-llvm-00bc95ec9a7b373baaf8f36f55f8022a59f4fb8b.tar.gz bcm5719-llvm-00bc95ec9a7b373baaf8f36f55f8022a59f4fb8b.zip |
[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
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 27 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/empty.h | 0 | ||||
-rw-r--r-- | clang/test/Modules/public-private.modulemap | 5 |
3 files changed, 23 insertions, 9 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 0bb98568b21..b4fe98488bc 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -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 && diff --git a/clang/test/Modules/Inputs/empty.h b/clang/test/Modules/Inputs/empty.h new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/clang/test/Modules/Inputs/empty.h diff --git a/clang/test/Modules/public-private.modulemap b/clang/test/Modules/public-private.modulemap new file mode 100644 index 00000000000..b07d1616653 --- /dev/null +++ b/clang/test/Modules/public-private.modulemap @@ -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" +} |