diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -1268,8 +1268,7 @@ HeaderList.push_back(KH); Mod->Headers[headerRoleToKind(Role)].push_back(Header); - bool isCompilingModuleHeader = - LangOpts.isCompilingModule() && Mod->getTopLevelModule() == SourceModule; + bool isCompilingModuleHeader = Mod->isForBuilding(LangOpts); if (!Imported || isCompilingModuleHeader) { // When we import HeaderFileInfo, the external source is expected to // set the isModuleHeader flag itself. diff --git a/clang/test/Modules/pch-with-module-name-import-twice.c b/clang/test/Modules/pch-with-module-name-import-twice.c new file mode 100644 --- /dev/null +++ b/clang/test/Modules/pch-with-module-name-import-twice.c @@ -0,0 +1,19 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t + +// This test checks that headers that are part of a module named by +// -fmodule-name= don't get included again if previously included from a PCH. + +//--- include/module.modulemap +module Mod { header "Mod.h" } +//--- include/Mod.h +struct Symbol {}; +//--- pch.h +#import "Mod.h" +//--- tu.c +#import "Mod.h" // expected-no-diagnostics + +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/cache -fimplicit-module-maps -fmodule-name=Mod -I %t/include \ +// RUN: -emit-pch -x c-header %t/pch.h -o %t/pch.pch +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/cache -fimplicit-module-maps -fmodule-name=Mod -I %t/include \ +// RUN: -fsyntax-only %t/tu.c -include-pch %t/pch.pch -verify