]> granicus.if.org Git - clang/commitdiff
[PCH] Fix a regression when PCH is used with -fmodules
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 7 Feb 2017 21:54:57 +0000 (21:54 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 7 Feb 2017 21:54:57 +0000 (21:54 +0000)
Following up on r291465 after a regression in r276159. When we use
-fmodule-name=X while building a PCH, modular headers in X will be
textually included and the compiler knows that we are not building
module X, so don't serialize such headers in the PCH as being part of a
module, because at this point they are not.

This was causing subtle bugs and malformed AST crashes, for instance,
when using the PCH in subsequent compiler invocation with -fmodules, the
HFI for a modular header would map to the PCH, which would force a
module load of and unexistent module ID.

rdar://problem/30171164

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

lib/Serialization/ASTWriter.cpp
test/Modules/Inputs/invalid-module-id/NC-Prefix.pch [new file with mode: 0644]
test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NC.h [new file with mode: 0644]
test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NU-Visibility.h [new file with mode: 0644]
test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NUGeometry.h [new file with mode: 0644]
test/Modules/Inputs/invalid-module-id/NC.framework/Modules/module.modulemap [new file with mode: 0644]
test/Modules/Inputs/invalid-module-id/NC.framework/Modules/module.private.modulemap [new file with mode: 0644]
test/Modules/Inputs/invalid-module-id/NC.framework/PrivateHeaders/NUAssert.h [new file with mode: 0644]
test/Modules/Inputs/invalid-module-id/NC.framework/PrivateHeaders/NULog.h [new file with mode: 0644]
test/Modules/invalid-pch-module-id.m [new file with mode: 0644]

index 69136015f4877603c362e15b7a2c61994d5e0e2b..5dee86c14190ed753242b9ab12e41025382172ca 100644 (file)
@@ -2544,7 +2544,8 @@ unsigned ASTWriter::getLocalOrImportedSubmoduleID(Module *Mod) {
 
   auto *Top = Mod->getTopLevelModule();
   if (Top != WritingModule &&
-      !Top->fullModuleNameIs(StringRef(getLangOpts().CurrentModule)))
+      (getLangOpts().CompilingPCH ||
+       !Top->fullModuleNameIs(StringRef(getLangOpts().CurrentModule))))
     return 0;
 
   return SubmoduleIDs[Mod] = NextSubmoduleID++;
diff --git a/test/Modules/Inputs/invalid-module-id/NC-Prefix.pch b/test/Modules/Inputs/invalid-module-id/NC-Prefix.pch
new file mode 100644 (file)
index 0000000..73a9816
--- /dev/null
@@ -0,0 +1,3 @@
+#ifdef __OBJC__
+  #import <NC/NULog.h>
+#endif
diff --git a/test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NC.h b/test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NC.h
new file mode 100644 (file)
index 0000000..3866c88
--- /dev/null
@@ -0,0 +1 @@
+#import <NC/NUGeometry.h>
diff --git a/test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NU-Visibility.h b/test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NU-Visibility.h
new file mode 100644 (file)
index 0000000..1e7614c
--- /dev/null
@@ -0,0 +1 @@
+// NU-Visibility.h
diff --git a/test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NUGeometry.h b/test/Modules/Inputs/invalid-module-id/NC.framework/Headers/NUGeometry.h
new file mode 100644 (file)
index 0000000..8923e04
--- /dev/null
@@ -0,0 +1 @@
+#import <NC/NU-Visibility.h>
diff --git a/test/Modules/Inputs/invalid-module-id/NC.framework/Modules/module.modulemap b/test/Modules/Inputs/invalid-module-id/NC.framework/Modules/module.modulemap
new file mode 100644 (file)
index 0000000..475b414
--- /dev/null
@@ -0,0 +1,6 @@
+framework module NC {
+  umbrella header "NC.h"
+
+  export *
+  module * { export * }
+}
diff --git a/test/Modules/Inputs/invalid-module-id/NC.framework/Modules/module.private.modulemap b/test/Modules/Inputs/invalid-module-id/NC.framework/Modules/module.private.modulemap
new file mode 100644 (file)
index 0000000..80488bd
--- /dev/null
@@ -0,0 +1,5 @@
+explicit module NC.Private
+{
+       header "NULog.h"
+       header "NUAssert.h"
+}
diff --git a/test/Modules/Inputs/invalid-module-id/NC.framework/PrivateHeaders/NUAssert.h b/test/Modules/Inputs/invalid-module-id/NC.framework/PrivateHeaders/NUAssert.h
new file mode 100644 (file)
index 0000000..7bf8def
--- /dev/null
@@ -0,0 +1 @@
+#import <NC/NULog.h>
diff --git a/test/Modules/Inputs/invalid-module-id/NC.framework/PrivateHeaders/NULog.h b/test/Modules/Inputs/invalid-module-id/NC.framework/PrivateHeaders/NULog.h
new file mode 100644 (file)
index 0000000..8923e04
--- /dev/null
@@ -0,0 +1 @@
+#import <NC/NU-Visibility.h>
diff --git a/test/Modules/invalid-pch-module-id.m b/test/Modules/invalid-pch-module-id.m
new file mode 100644 (file)
index 0000000..34d9995
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: rm -rf %t.cache
+//
+// RUN: %clang_cc1 -x objective-c-header -fmodules -F%S/Inputs/invalid-module-id \
+// RUN:  -fmodule-implementation-of NC -fmodules-cache-path=%t.cache \
+// RUN:  -fimplicit-module-maps \
+// RUN:  -emit-pch %S/Inputs/invalid-module-id/NC-Prefix.pch -o %t.pch
+//
+// RUN: %clang_cc1 -x objective-c -fmodules -F%S/Inputs/invalid-module-id \
+// RUN:  -fmodule-implementation-of NC -fmodules-cache-path=%t.cache \
+// RUN:  -fimplicit-module-maps -include-pch %t.pch %s -fsyntax-only
+
+#import <NC/NULog.h>
+#import <NC/NUGeometry.h>