xref: /llvm-project/clang/test/ClangScanDeps/optimize-canonicalize-macros.m (revision 68eb3b202f30a1c3f2575f44b9d16365258e66b6)
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