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

Richard Smith richard-llvm at metafoo.co.uk
Mon Mar 9 17:19:04 PDT 2015


Author: rsmith
Date: Mon Mar  9 19:19:04 2015
New Revision: 231728

URL: http://llvm.org/viewvc/llvm-project?rev=231728&view=rev
Log:
[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.)

Modified:
    cfe/trunk/lib/Lex/ModuleMap.cpp
    cfe/trunk/test/Modules/public-private.modulemap

Modified: cfe/trunk/lib/Lex/ModuleMap.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=231728&r1=231727&r2=231728&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/ModuleMap.cpp (original)
+++ cfe/trunk/lib/Lex/ModuleMap.cpp Mon Mar  9 19:19:04 2015
@@ -219,28 +219,21 @@ static bool violatesPrivateInclude(Modul
                                    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;

Modified: cfe/trunk/test/Modules/public-private.modulemap
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/public-private.modulemap?rev=231728&r1=231727&r2=231728&view=diff
==============================================================================
--- cfe/trunk/test/Modules/public-private.modulemap (original)
+++ cfe/trunk/test/Modules/public-private.modulemap Mon Mar  9 19:19:04 2015
@@ -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"
+}





More information about the cfe-commits mailing list