]> granicus.if.org Git - clang/commitdiff
[modules] This check is run before we resolve the header, not after, so just
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 10 Mar 2015 00:19:04 +0000 (00:19 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 10 Mar 2015 00:19:04 +0000 (00:19 +0000)
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

lib/Lex/ModuleMap.cpp
test/Modules/public-private.modulemap

index b4fe98488bc207a21c15619c7c77959b4e4cc9ae..4fbed2cc0649f9e20dfdf6614d91ca1a2e299969 100644 (file)
@@ -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;
index b07d1616653956e04ae27722db34aaf0c202a531..ef4ae9885fed7228c6cffb47c5bdf73c6aeb768d 100644 (file)
@@ -1,5 +1,10 @@
 // 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"
+}