]> granicus.if.org Git - clang/commitdiff
[modules] Don't assert if the same header is named as both a public and a
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 9 Mar 2015 23:46:50 +0000 (23:46 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 9 Mar 2015 23:46:50 +0000 (23:46 +0000)
private header within the same module.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231725 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/ModuleMap.cpp
test/Modules/Inputs/empty.h [new file with mode: 0644]
test/Modules/public-private.modulemap [new file with mode: 0644]

index 0bb98568b21e831806dc86ac106b264600bca959..b4fe98488bc207a21c15619c7c77959b4e4cc9ae 100644 (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 &&
diff --git a/test/Modules/Inputs/empty.h b/test/Modules/Inputs/empty.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/Modules/public-private.modulemap b/test/Modules/public-private.modulemap
new file mode 100644 (file)
index 0000000..b07d161
--- /dev/null
@@ -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"
+}