17847e445SMichael Spencer// This test checks that VFS usage doesn't leak between modules. 27847e445SMichael Spencer 37847e445SMichael Spencer// RUN: rm -rf %t && split-file %s %t 47847e445SMichael Spencer// RUN: sed -e "s|DIR|%/t|g" %t/build/cdb.json.in > %t/build/cdb.json 57847e445SMichael Spencer// RUN: sed -e "s|DIR|%/t|g" %t/build/vfs.yaml.in > %t/build/vfs.yaml 67847e445SMichael Spencer// RUN: clang-scan-deps -compilation-database %t/build/cdb.json \ 77847e445SMichael Spencer// RUN: -format experimental-full --optimize-args=vfs > %t/deps.json 87847e445SMichael Spencer// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t 97847e445SMichael Spencer 107847e445SMichael Spencer// CHECK: { 117847e445SMichael Spencer// CHECK-NEXT: "modules": [ 127847e445SMichael Spencer// CHECK-NEXT: { 137847e445SMichael Spencer// CHECK-NEXT: "clang-module-deps": [ 147847e445SMichael Spencer// CHECK-NEXT: { 157847e445SMichael Spencer// CHECK-NEXT: "context-hash": "{{.*}}", 167847e445SMichael Spencer// CHECK-NEXT: "module-name": "B" 177847e445SMichael Spencer// CHECK-NEXT: }, 187847e445SMichael Spencer// CHECK-NEXT: { 197847e445SMichael Spencer// CHECK-NEXT: "context-hash": "{{.*}}", 207847e445SMichael Spencer// CHECK-NEXT: "module-name": "C" 217847e445SMichael Spencer// CHECK-NEXT: } 227847e445SMichael Spencer// CHECK-NEXT: ], 237847e445SMichael Spencer// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/moduleA/module.modulemap", 247847e445SMichael Spencer// CHECK-NEXT: "command-line": [ 257847e445SMichael Spencer// Module A needs the VFS overlay because its dependency, module B, needs it. 267847e445SMichael Spencer// CHECK: "-ivfsoverlay" 277847e445SMichael Spencer// CHECK-NEXT: "[[PREFIX]]/build/vfs.yaml" 287847e445SMichael Spencer// CHECK: ], 297847e445SMichael Spencer// CHECK-NEXT: "context-hash": "{{.*}}", 307847e445SMichael Spencer// CHECK-NEXT: "file-deps": [ 317847e445SMichael Spencer// CHECK: ], 32*68eb3b20SArtem Chikin// CHECK-NEXT: "link-libraries": [], 337847e445SMichael Spencer// CHECK-NEXT: "name": "A" 347847e445SMichael Spencer// CHECK-NEXT: }, 357847e445SMichael Spencer// CHECK-NEXT: { 367847e445SMichael Spencer// CHECK-NEXT: "clang-module-deps": [], 377847e445SMichael Spencer// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/moduleB/module.modulemap", 387847e445SMichael Spencer// CHECK-NEXT: "command-line": [ 397847e445SMichael Spencer// Module B needs the VFS overlay because it provides the header referred to by the module map. 407847e445SMichael Spencer// CHECK: "-ivfsoverlay" 417847e445SMichael Spencer// CHECK-NEXT: "[[PREFIX]]/build/vfs.yaml" 427847e445SMichael Spencer// CHECK: ], 437847e445SMichael Spencer// CHECK-NEXT: "context-hash": "{{.*}}", 447847e445SMichael Spencer// CHECK-NEXT: "file-deps": [ 457847e445SMichael Spencer// CHECK: ], 46*68eb3b20SArtem Chikin// CHECK-NEXT: "link-libraries": [], 477847e445SMichael Spencer// CHECK-NEXT: "name": "B" 487847e445SMichael Spencer// CHECK-NEXT: }, 497847e445SMichael Spencer// CHECK-NEXT: { 507847e445SMichael Spencer// CHECK-NEXT: "clang-module-deps": [], 517847e445SMichael Spencer// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/moduleC/module.modulemap", 527847e445SMichael Spencer// CHECK-NEXT: "command-line": [ 537847e445SMichael Spencer// Module C doesn't need the VFS overlay. 547847e445SMichael Spencer// CHECK-NOT: "-ivfsoverlay" 557847e445SMichael Spencer// CHECK: ], 567847e445SMichael Spencer// CHECK-NEXT: "context-hash": "{{.*}}", 577847e445SMichael Spencer// CHECK-NEXT: "file-deps": [ 587847e445SMichael Spencer// CHECK: ], 59*68eb3b20SArtem Chikin// CHECK-NEXT: "link-libraries": [], 607847e445SMichael Spencer// CHECK-NEXT: "name": "C" 617847e445SMichael Spencer// CHECK-NEXT: } 627847e445SMichael Spencer// CHECK-NEXT: ], 637847e445SMichael Spencer// CHECK-NEXT: "translation-units": [ 647847e445SMichael Spencer// CHECK: ] 657847e445SMichael Spencer// CHECK: } 667847e445SMichael Spencer 677847e445SMichael Spencer//--- build/cdb.json.in 687847e445SMichael Spencer[{ 697847e445SMichael Spencer "directory": "DIR", 707847e445SMichael Spencer "command": "clang -c DIR/tu.m -I DIR/moduleA -I DIR/moduleB -I DIR/moduleC -fmodules -fmodules-cache-path=DIR/cache -fimplicit-module-maps -ivfsoverlay DIR/build/vfs.yaml", 717847e445SMichael Spencer "file": "DIR/tu.m" 727847e445SMichael Spencer}] 737847e445SMichael Spencer 747847e445SMichael Spencer//--- build/vfs.yaml.in 757847e445SMichael Spencer{ 767847e445SMichael Spencer "version": 0, 777847e445SMichael Spencer "case-sensitive": "false", 787847e445SMichael Spencer "roots": [ 797847e445SMichael Spencer { 807847e445SMichael Spencer "contents": [ 817847e445SMichael Spencer { 827847e445SMichael Spencer "external-contents": "DIR/build/B.h", 837847e445SMichael Spencer "name": "B.h", 847847e445SMichael Spencer "type": "file" 857847e445SMichael Spencer } 867847e445SMichael Spencer ], 877847e445SMichael Spencer "name": "DIR/moduleB", 887847e445SMichael Spencer "type": "directory" 897847e445SMichael Spencer } 907847e445SMichael Spencer ] 917847e445SMichael Spencer} 927847e445SMichael Spencer 937847e445SMichael Spencer//--- tu.m 947847e445SMichael Spencer@import A; 957847e445SMichael Spencer 967847e445SMichael Spencer//--- moduleA/module.modulemap 977847e445SMichael Spencermodule A { header "A.h" } 987847e445SMichael Spencer//--- moduleA/A.h 997847e445SMichael Spencer@import B; 1007847e445SMichael Spencer@import C; 1017847e445SMichael Spencer 1027847e445SMichael Spencer//--- moduleB/module.modulemap 1037847e445SMichael Spencermodule B { header "B.h" } 1047847e445SMichael Spencer//--- build/B.h 1057847e445SMichael Spencer 1067847e445SMichael Spencer//--- moduleC/module.modulemap 1077847e445SMichael Spencermodule C { header "C.h" } 1087847e445SMichael Spencer//--- moduleC/C.h 109