1 // RUN: rm -rf %t && mkdir %t 2 // RUN: cp -r %S/Inputs/modules-context-hash/* %t 3 4 // Check that the scanner reports the same module as distinct dependencies when 5 // a single translation unit gets compiled with multiple command-lines that 6 // produce different **strict** context hashes. 7 8 // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_a.json.template > %t/cdb_a.json 9 // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_b.json.template > %t/cdb_b.json 10 11 // We run two separate scans. The context hash for "a" and "b" can differ between 12 // systems. If we'd scan both Clang invocations in a single run, the order of JSON 13 // entities would be non-deterministic. To prevent this, run the scans separately 14 // and verify that the context hashes differ with a single FileCheck invocation. 15 // 16 // RUN: clang-scan-deps -compilation-database %t/cdb_a.json -format experimental-full -j 1 > %t/result.json 17 // RUN: clang-scan-deps -compilation-database %t/cdb_b.json -format experimental-full -j 1 >> %t/result.json 18 // RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK 19 20 // CHECK: { 21 // CHECK-NEXT: "modules": [ 22 // CHECK-NEXT: { 23 // CHECK-NEXT: "clang-module-deps": [], 24 // CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", 25 // CHECK-NEXT: "command-line": [ 26 // CHECK-NEXT: "-cc1" 27 // CHECK: "-emit-module" 28 // CHECK: "-I" 29 // CHECK: "[[PREFIX]]/a" 30 // CHECK: "-fmodule-name=mod" 31 // CHECK: ], 32 // CHECK-NEXT: "context-hash": "[[HASH_MOD_A:.*]]", 33 // CHECK-NEXT: "file-deps": [ 34 // CHECK-NEXT: "[[PREFIX]]/a/dep.h", 35 // CHECK-NEXT: "[[PREFIX]]/mod.h", 36 // CHECK-NEXT: "[[PREFIX]]/module.modulemap" 37 // CHECK-NEXT: ], 38 // CHECK-NEXT: "name": "mod" 39 // CHECK-NEXT: } 40 // CHECK-NEXT: ], 41 // CHECK-NEXT: "translation-units": [ 42 // CHECK-NEXT: { 43 // CHECK-NEXT: "clang-context-hash": "{{.*}}", 44 // CHECK-NEXT: "clang-module-deps": [ 45 // CHECK-NEXT: { 46 // CHECK-NEXT: "context-hash": "[[HASH_MOD_A]]", 47 // CHECK-NEXT: "module-name": "mod" 48 // CHECK-NEXT: } 49 // CHECK-NEXT: ], 50 // CHECK-NEXT: "command-line": [ 51 // CHECK: "-fno-implicit-modules", 52 // CHECK-NEXT: "-fno-implicit-module-maps" 53 // CHECK-NEXT: ], 54 // CHECK-NEXT: "file-deps": [ 55 // CHECK-NEXT: "[[PREFIX]]/tu.c" 56 // CHECK-NEXT: ], 57 // CHECK-NEXT: "input-file": "[[PREFIX]]/tu.c" 58 // CHECK-NEXT: } 59 // CHECK-NEXT: ] 60 // CHECK-NEXT: } 61 // CHECK-NEXT: { 62 // CHECK-NEXT: "modules": [ 63 // CHECK-NEXT: { 64 // CHECK-NEXT: "clang-module-deps": [], 65 // CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", 66 // CHECK-NEXT: "command-line": [ 67 // CHECK-NEXT: "-cc1" 68 // CHECK: "-emit-module" 69 // CHECK: "-I" 70 // CHECK: "[[PREFIX]]/b" 71 // CHECK: "-fmodule-name=mod" 72 // CHECK: ], 73 // CHECK-NOT: "context-hash": "[[HASH_MOD_A]]", 74 // CHECK: "file-deps": [ 75 // CHECK-NEXT: "[[PREFIX]]/b/dep.h", 76 // CHECK-NEXT: "[[PREFIX]]/mod.h", 77 // CHECK-NEXT: "[[PREFIX]]/module.modulemap" 78 // CHECK-NEXT: ], 79 // CHECK-NEXT: "name": "mod" 80 // CHECK-NEXT: } 81 // CHECK-NEXT: ], 82 // CHECK-NEXT: "translation-units": [ 83 // CHECK-NEXT: { 84 // CHECK-NEXT: "clang-context-hash": "{{.*}}", 85 // CHECK-NEXT: "clang-module-deps": [ 86 // CHECK-NEXT: { 87 // CHECK-NOT: "context-hash": "[[HASH_MOD_A]]", 88 // CHECK: "module-name": "mod" 89 // CHECK-NEXT: } 90 // CHECK-NEXT: ], 91 // CHECK-NEXT: "command-line": [ 92 // CHECK: "-fno-implicit-modules", 93 // CHECK-NEXT: "-fno-implicit-module-maps" 94 // CHECK-NEXT: ], 95 // CHECK-NEXT: "file-deps": [ 96 // CHECK-NEXT: "[[PREFIX]]/tu.c" 97 // CHECK-NEXT: ], 98 // CHECK-NEXT: "input-file": "[[PREFIX]]/tu.c" 99 // CHECK-NEXT: } 100 // CHECK-NEXT: ] 101 // CHECK-NEXT: } 102