1d42de86eSMichael Spencer// This test verifies that command lines with equivalent -D and -U arguments 2d42de86eSMichael Spencer// are canonicalized to the same module variant. 3d42de86eSMichael Spencer 4d42de86eSMichael Spencer// RUN: rm -rf %t 5d42de86eSMichael Spencer// RUN: split-file %s %t 6d42de86eSMichael Spencer// RUN: sed -e "s|DIR|%/t|g" %t/build/compile-commands.json.in > %t/build/compile-commands.json 7d42de86eSMichael Spencer// RUN: clang-scan-deps -compilation-database %t/build/compile-commands.json \ 8d42de86eSMichael Spencer// RUN: -j 1 -format experimental-full -optimize-args=canonicalize-macros > %t/deps.db 9d42de86eSMichael Spencer// RUN: cat %t/deps.db | FileCheck %s -DPREFIX=%/t 10d42de86eSMichael Spencer 11d42de86eSMichael Spencer// Verify that there are only two variants and that the expected merges have 12d42de86eSMichael Spencer// happened. 13d42de86eSMichael Spencer 14d42de86eSMichael Spencer// CHECK: { 15d42de86eSMichael Spencer// CHECK-NEXT: "modules": [ 16d42de86eSMichael Spencer// CHECK-NEXT: { 17d42de86eSMichael Spencer// CHECK-NEXT: "clang-module-deps": [], 18d42de86eSMichael Spencer// CHECK-NEXT: "clang-modulemap-file": 19d42de86eSMichael Spencer// CHECK-NEXT: "command-line": [ 20d42de86eSMichael Spencer// CHECK-NOT: "J=1" 21d42de86eSMichael Spencer// CHECK-NOT: "J" 22d42de86eSMichael Spencer// CHECK-NOT: "K" 23d42de86eSMichael Spencer// CHECK: ], 24d42de86eSMichael Spencer// CHECK-NEXT: "context-hash": "{{.*}}", 25d42de86eSMichael Spencer// CHECK-NEXT: "file-deps": [ 26d42de86eSMichael Spencer// CHECK: ], 27*68eb3b20SArtem Chikin// CHECK-NEXT: "link-libraries": [], 28d42de86eSMichael Spencer// CHECK-NEXT: "name": "A" 29d42de86eSMichael Spencer// CHECK-NEXT: }, 30d42de86eSMichael Spencer// CHECK-NEXT: { 31d42de86eSMichael Spencer// CHECK-NEXT: "clang-module-deps": [], 32d42de86eSMichael Spencer// CHECK-NEXT: "clang-modulemap-file": 33d42de86eSMichael Spencer// CHECK-NEXT: "command-line": [ 34d42de86eSMichael Spencer// CHECK: "Fඞ" 35d42de86eSMichael Spencer// CHECK: 0D9E 36d42de86eSMichael Spencer// CHECK: "K" 37d42de86eSMichael Spencer// CHECK: "K" 38d42de86eSMichael Spencer// CHECK: ], 39d42de86eSMichael Spencer// CHECK-NEXT: "context-hash": "{{.*}}", 40d42de86eSMichael Spencer// CHECK-NEXT: "file-deps": [ 41d42de86eSMichael Spencer// CHECK: ], 42*68eb3b20SArtem Chikin// CHECK-NEXT: "link-libraries": [], 43d42de86eSMichael Spencer// CHECK-NEXT: "name": "A" 44d42de86eSMichael Spencer// CHECK-NEXT: } 45d42de86eSMichael Spencer// CHECK-NEXT: ], 46d42de86eSMichael Spencer// CHECK-NEXT: "translation-units": [ 47d42de86eSMichael Spencer// CHECK: ] 48d42de86eSMichael Spencer// CHECK: } 49d42de86eSMichael Spencer 50d42de86eSMichael Spencer 51d42de86eSMichael Spencer//--- build/compile-commands.json.in 52d42de86eSMichael Spencer 53d42de86eSMichael Spencer[ 54d42de86eSMichael Spencer{ 55d42de86eSMichael Spencer "directory": "DIR", 56d42de86eSMichael Spencer "command": "clang -c DIR/tu0.m -DJ=1 -UJ -DJ=2 -DI -DK(x)=x -I modules/A -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps", 57d42de86eSMichael Spencer "file": "DIR/tu0.m" 58d42de86eSMichael Spencer}, 59d42de86eSMichael Spencer{ 60d42de86eSMichael Spencer "directory": "DIR", 61d42de86eSMichael Spencer "command": "clang -c DIR/tu1.m -DK -DK(x)=x -DI -D \"J=2\" -I modules/A -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps", 62d42de86eSMichael Spencer "file": "DIR/tu1.m" 63d42de86eSMichael Spencer}, 64d42de86eSMichael Spencer{ 65d42de86eSMichael Spencer "directory": "DIR", 66d42de86eSMichael Spencer "command": "clang -c DIR/tu2.m -I modules/A -DFඞ \"-DF\\\\u{0D9E}\" -DK -DK -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps", 67d42de86eSMichael Spencer "file": "DIR/tu2.m" 68d42de86eSMichael Spencer} 69d42de86eSMichael Spencer] 70d42de86eSMichael Spencer 71d42de86eSMichael Spencer//--- modules/A/module.modulemap 72d42de86eSMichael Spencer 73d42de86eSMichael Spencermodule A { 74d42de86eSMichael Spencer umbrella header "A.h" 75d42de86eSMichael Spencer} 76d42de86eSMichael Spencer 77d42de86eSMichael Spencer//--- modules/A/A.h 78d42de86eSMichael Spencer 79d42de86eSMichael Spencer//--- tu0.m 80d42de86eSMichael Spencer 81d42de86eSMichael Spencer#include <A.h> 82d42de86eSMichael Spencer 83d42de86eSMichael Spencer//--- tu1.m 84d42de86eSMichael Spencer 85d42de86eSMichael Spencer#include <A.h> 86d42de86eSMichael Spencer 87d42de86eSMichael Spencer//--- tu2.m 88d42de86eSMichael Spencer 89d42de86eSMichael Spencer#include <A.h> 90