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
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++;
--- /dev/null
+#ifdef __OBJC__
+ #import <NC/NULog.h>
+#endif
--- /dev/null
+#import <NC/NUGeometry.h>
--- /dev/null
+// NU-Visibility.h
--- /dev/null
+#import <NC/NU-Visibility.h>
--- /dev/null
+framework module NC {
+ umbrella header "NC.h"
+
+ export *
+ module * { export * }
+}
--- /dev/null
+explicit module NC.Private
+{
+ header "NULog.h"
+ header "NUAssert.h"
+}
--- /dev/null
+#import <NC/NULog.h>
--- /dev/null
+#import <NC/NU-Visibility.h>
--- /dev/null
+// 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>