diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1544,7 +1544,6 @@ continue; if (isModuleMap(File.getFileCharacteristic()) && - !isSystem(File.getFileCharacteristic()) && !AffectingModuleMaps.empty() && AffectingModuleMaps.find(Cache->OrigEntry) == AffectingModuleMaps.end()) { diff --git a/clang/test/ClangScanDeps/modules-implicit-dot-private.m b/clang/test/ClangScanDeps/modules-implicit-dot-private.m --- a/clang/test/ClangScanDeps/modules-implicit-dot-private.m +++ b/clang/test/ClangScanDeps/modules-implicit-dot-private.m @@ -15,7 +15,7 @@ [{ "file": "DIR/tu.m", "directory": "DIR", - "command": "clang -fmodules -fmodules-cache-path=DIR/cache -iframework DIR/frameworks -c DIR/tu.m -o DIR/tu.o" + "command": "clang -fmodules -fmodules-cache-path=DIR/cache -F DIR/frameworks -c DIR/tu.m -o DIR/tu.o" }] //--- tu.m @import FW.Private; @@ -33,8 +33,7 @@ // CHECK-NEXT: "context-hash": "{{.*}}", // CHECK: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Headers/FW.h", -// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", -// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap" +// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "name": "FW" // CHECK: }, @@ -45,7 +44,6 @@ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", // CHECK: "file-deps": [ -// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", // CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", // CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/PrivateHeaders/FW_Private.h" // CHECK-NEXT: ], diff --git a/clang/test/ClangScanDeps/modules-incomplete-umbrella.c b/clang/test/ClangScanDeps/modules-incomplete-umbrella.c --- a/clang/test/ClangScanDeps/modules-incomplete-umbrella.c +++ b/clang/test/ClangScanDeps/modules-incomplete-umbrella.c @@ -45,8 +45,7 @@ // CHECK_TU-NEXT: "context-hash": "{{.*}}", // CHECK_TU-NEXT: "file-deps": [ // CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/Headers/FW.h", -// CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", -// CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap" +// CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap" // CHECK_TU-NEXT: ], // CHECK_TU-NEXT: "name": "FW" // CHECK_TU-NEXT: }, @@ -57,7 +56,6 @@ // CHECK_TU: ], // CHECK_TU-NEXT: "context-hash": "{{.*}}", // CHECK_TU-NEXT: "file-deps": [ -// CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", // CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", // CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/PrivateHeaders/FW_Private.h", // CHECK_TU-NEXT: "[[PREFIX]]/frameworks/FW.framework/PrivateHeaders/One.h" @@ -102,7 +100,7 @@ [{ "file": "DIR/from_module.m", "directory": "DIR", - "command": "clang -fmodules -fmodules-cache-path=DIR/cache -iframework DIR/frameworks -c DIR/from_module.m -o DIR/from_module.o" + "command": "clang -fmodules -fmodules-cache-path=DIR/cache -F DIR/frameworks -c DIR/from_module.m -o DIR/from_module.o" }] //--- module.modulemap module Mod { header "Mod.h" } @@ -125,8 +123,7 @@ // CHECK_MODULE-NEXT: "context-hash": "{{.*}}", // CHECK_MODULE-NEXT: "file-deps": [ // CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/Headers/FW.h", -// CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", -// CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap" +// CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap" // CHECK_MODULE-NEXT: ], // CHECK_MODULE-NEXT: "name": "FW" // CHECK_MODULE-NEXT: }, @@ -137,7 +134,6 @@ // CHECK_MODULE: ], // CHECK_MODULE-NEXT: "context-hash": "{{.*}}", // CHECK_MODULE-NEXT: "file-deps": [ -// CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", // CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", // CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/PrivateHeaders/FW_Private.h", // CHECK_MODULE-NEXT: "[[PREFIX]]/frameworks/FW.framework/PrivateHeaders/One.h" diff --git a/clang/test/ClangScanDeps/modules-redefinition.m b/clang/test/ClangScanDeps/modules-redefinition.m new file mode 100644 --- /dev/null +++ b/clang/test/ClangScanDeps/modules-redefinition.m @@ -0,0 +1,37 @@ +// This test checks that we don't report (potentially) duplicate module maps +// implicit build picked up from a system search directory. + +// RUN: rm -rf %t +// RUN: split-file %s %t + +//--- tu.m +@import first; // this doesn't repro with "@import third;" + +//--- zeroth/module.modulemap +module X {} // module name must match "-fmodule-name=" value + +//--- first/module.modulemap +module first { header "first.h" } +//--- first/first.h +@import third; +//--- second/module.modulemap +module X {} +//--- third/module.modulemap +module third {} + +//--- cdb.json.template +[{ + "file": "DIR/tu.m", + "directory": "DIR", + "command": "clang -fmodules -fmodules-cache-path=DIR/cache -fmodule-name=X -fmodule-map-file=DIR/zeroth/module.modulemap -isystem DIR/first -isystem DIR/second -isystem DIR/third -c DIR/tu.m -o DIR/tu.o" +}] + +// RUN: %clang -fmodules -fmodules-cache-path=%t/cache -fmodule-name=X -fmodule-map-file=%t/zeroth/module.modulemap -isystem %t/first -isystem %t/second -isystem %t/third -c %t/tu.m -o %t/tu.o + +// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json + +// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json +// RUN: %deps-to-rsp %t/result.json --module-name=third > %t/third.cc1.rsp +// RUN: %deps-to-rsp %t/result.json --module-name=first > %t/first.cc1.rsp +// RUN: %clang @%t/third.cc1.rsp +// RUN: %clang @%t/first.cc1.rsp