r252170 - Allow use of private headers in different sub-modules.

Manuel Klimek via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 5 07:24:52 PST 2015


Author: klimek
Date: Thu Nov  5 09:24:47 2015
New Revision: 252170

URL: http://llvm.org/viewvc/llvm-project?rev=252170&view=rev
Log:
Allow use of private headers in different sub-modules.

Added:
    cfe/trunk/test/Modules/Inputs/private3/
    cfe/trunk/test/Modules/Inputs/private3/private.h
    cfe/trunk/test/Modules/Inputs/private3/public.h
    cfe/trunk/test/Modules/private.modulemap
Modified:
    cfe/trunk/lib/Lex/ModuleMap.cpp

Modified: cfe/trunk/lib/Lex/ModuleMap.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=252170&r1=252169&r2=252170&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/ModuleMap.cpp (original)
+++ cfe/trunk/lib/Lex/ModuleMap.cpp Thu Nov  5 09:24:47 2015
@@ -231,11 +231,9 @@ static bool violatesPrivateInclude(Modul
     assert((!IsPrivateRole || IsPrivate) && "inconsistent headers and roles");
   }
 #endif
-  return IsPrivateRole &&
-         // FIXME: Should we map RequestingModule to its top-level module here
-         //        too? This check is redundant with the isSubModuleOf check in
-         //        diagnoseHeaderInclusion.
-         RequestedModule->getTopLevelModule() != RequestingModule;
+  return IsPrivateRole && (!RequestingModule ||
+                           RequestedModule->getTopLevelModule() !=
+                               RequestingModule->getTopLevelModule());
 }
 
 static Module *getTopLevelOrNull(Module *M) {
@@ -261,11 +259,6 @@ void ModuleMap::diagnoseHeaderInclusion(
   HeadersMap::iterator Known = findKnownHeader(File);
   if (Known != Headers.end()) {
     for (const KnownHeader &Header : Known->second) {
-      // If 'File' is part of 'RequestingModule' we can definitely include it.
-      if (Header.getModule() &&
-          Header.getModule()->isSubModuleOf(RequestingModule))
-        return;
-
       // Remember private headers for later printing of a diagnostic.
       if (violatesPrivateInclude(RequestingModule, File, Header.getRole(),
                                  Header.getModule())) {

Added: cfe/trunk/test/Modules/Inputs/private3/private.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/private3/private.h?rev=252170&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/private3/private.h (added)
+++ cfe/trunk/test/Modules/Inputs/private3/private.h Thu Nov  5 09:24:47 2015
@@ -0,0 +1,7 @@
+#ifndef PRIVATE_H
+#define PRIVATE_H
+
+void priv();
+
+#endif
+

Added: cfe/trunk/test/Modules/Inputs/private3/public.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/private3/public.h?rev=252170&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/private3/public.h (added)
+++ cfe/trunk/test/Modules/Inputs/private3/public.h Thu Nov  5 09:24:47 2015
@@ -0,0 +1,11 @@
+#ifndef PUBLIC_H
+#define PUBLIC_H
+
+#include "private.h"
+
+void pub() {
+  priv();
+}
+
+#endif
+

Added: cfe/trunk/test/Modules/private.modulemap
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/private.modulemap?rev=252170&view=auto
==============================================================================
--- cfe/trunk/test/Modules/private.modulemap (added)
+++ cfe/trunk/test/Modules/private.modulemap Thu Nov  5 09:24:47 2015
@@ -0,0 +1,35 @@
+// RUN: rm -rf %t
+// RUN: cd %S
+// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \
+// RUN:   -I%S/Inputs/private3 -emit-module -fmodule-name=A -o %t/m.pcm %s
+// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \
+// RUN:   -I%S/Inputs/private3 -emit-module -fmodule-name=B -o %t/m.pcm %s
+// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \
+// RUN:   -I%S/Inputs/private3 -emit-module -fmodule-name=C -o %t/m.pcm %s
+// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \
+// RUN:   -I%S/Inputs/private3 -emit-module -fmodule-name=D -o %t/m.pcm %s
+
+module A {
+  header "Inputs/private3/public.h"
+  private header "Inputs/private3/private.h"
+}
+module B {
+  header "Inputs/private3/public.h"
+  module "private.h" {
+    private header "Inputs/private3/private.h"
+  }
+}
+module C {
+  module "public.h" {
+    header "Inputs/private3/public.h"
+  }
+  private header "Inputs/private3/private.h"
+}
+module D {
+  module "public.h" {
+    header "Inputs/private3/public.h"
+  }
+  module "private.h" {
+    private header "Inputs/private3/private.h"
+  }
+}




More information about the cfe-commits mailing list