xref: /llvm-project/clang/test/ClangScanDeps/modules-implementation-vfs.m (revision 73dba2f649a8e8c01e9c8b8df3bdc89cdf0fd7ee)
1// Ensure we get the virtual module map path for a module whose implementation
2// file we are compiling.
3
4// RUN: rm -rf %t
5// RUN: split-file %s %t
6
7//--- real/A.modulemap
8framework module A { umbrella header "A.h" }
9//--- real/A.private.modulemap
10framework module A_Private { umbrella header "A_Private.h" }
11
12//--- frameworks/A.framework/Headers/A.h
13struct A { int x; };
14//--- frameworks/A.framework/PrivateHeaders/A_Private.h
15#import <A/A.h>
16
17//--- frameworks/B.framework/Headers/B.h
18#import <A/A.h>
19//--- frameworks/B.framework/Modules/module.modulemap
20framework module B { umbrella header "B.h" }
21
22//--- overlay.json.template
23{
24  "case-sensitive": "false",
25  "version": 0,
26  "roots": [
27    {
28      "external-contents": "DIR/real/A.modulemap",
29      "name": "DIR/frameworks/A.framework/Modules/module.modulemap",
30      "type": "file"
31    },
32    {
33      "external-contents": "DIR/real/A.private.modulemap",
34      "name": "DIR/frameworks/A.framework/Modules/module.private.modulemap",
35      "type": "file"
36    },
37  ]
38}
39
40//--- cdb.json.template
41[
42{
43  "file": "DIR/tu1.m",
44  "directory": "DIR",
45  "command": "clang -fmodules -fmodules-cache-path=DIR/cache -fmodule-name=A -ivfsoverlay DIR/overlay.json -F DIR/frameworks -fsyntax-only DIR/tu1.m"
46},
47{
48  "file": "DIR/tu2.m",
49  "directory": "DIR",
50  "command": "clang -fmodules -fmodules-cache-path=DIR/cache -fmodule-name=A -ivfsoverlay DIR/overlay.json -F DIR/frameworks -fsyntax-only DIR/tu2.m"
51},
52{
53  "file": "DIR/tu3.m",
54  "directory": "DIR",
55  "command": "clang -fmodules -fmodules-cache-path=DIR/cache -fmodule-name=A -ivfsoverlay DIR/overlay.json -F DIR/frameworks -fsyntax-only DIR/tu3.m"
56}
57]
58
59//--- tu1.m
60#import <A/A.h>
61
62//--- tu2.m
63#import <A/A_Private.h>
64
65//--- tu3.m
66#import <B/B.h>
67// The following code triggers a note diagnostic pointing to A.h which is
68// resolved relative to the module base directory, which is affected by the
69// modulemap path.
70struct A { float x; }; // expected-error {{incompatible definitions}} expected-note {{type 'float' here}}
71// expected-note@frameworks/A.framework/Headers/A.h:1 {{type 'int' here}}
72
73// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json
74// RUN: sed -e "s|DIR|%/t|g" %t/overlay.json.template > %t/overlay.json
75
76// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full -j 1 > %t/result.json
77// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t
78// CHECK:      {
79// CHECK:        "modules": [
80// CHECK:          {
81// CHECK:            "clang-module-deps": []
82// CHECK:            "command-line": [
83// CHECK:              "-x"
84// CHECK-NEXT:         "objective-c"
85// CHECK-NEXT:         "[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap"
86// CHECK:            ]
87// CHECK:            "name": "A"
88// CHECK:          }
89// CHECK:          {
90// CHECK:            "clang-module-deps": [
91// CHECK:              {
92// CHECK:                "module-name": "A"
93// CHECK:              }
94// CHECK:            ]
95// CHECK:            "command-line": [
96// CHECK:              "-fmodule-map-file=[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap",
97// CHECK:              "-x"
98// CHECK-NEXT:         "objective-c"
99// CHECK-NEXT:         "[[PREFIX]]/frameworks/B.framework/Modules/module.modulemap"
100// CHECK:            ]
101// CHECK:            "name": "B"
102// CHECK:          }
103
104// CHECK:        "translation-units": [
105// CHECK-NEXT:     {
106// CHECK-NEXT:       "commands": [
107// CHECK:              {
108// CHECK:                "command-line": [
109// CHECK:                  "-fmodule-map-file=[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap"
110// CHECK:                  "-fmodule-name=A"
111// CHECK:                ],
112// CHECK:                "input-file": "[[PREFIX]]/tu1.m"
113// CHECK-NEXT:         }
114// CHECK:            ]
115// CHECK:          }
116// CHECK-NEXT:     {
117// CHECK-NEXT:       "commands": [
118// CHECK:              {
119// CHECK:                "command-line": [
120// CHECK:                  "-fmodule-map-file=[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap"
121// CHECK:                  "-fmodule-name=A"
122// CHECK:                ],
123// CHECK:                "input-file": "[[PREFIX]]/tu2.m"
124// CHECK-NEXT:         }
125// CHECK:            ]
126// CHECK:          }
127// CHECK-NEXT:     {
128// CHECK-NEXT:       "commands": [
129// CHECK:              {
130// CHECK:                "clang-module-deps": [
131// CHECK:                  {
132// CHECK:                    "module-name": "B"
133// CHECK:                  }
134// CHECK:                ]
135// CHECK:                "command-line": [
136// CHECK:                  "-fmodule-map-file=[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap"
137// CHECK:                  "-fmodule-map-file=[[PREFIX]]/frameworks/B.framework/Modules/module.modulemap"
138// CHECK:                  "-fmodule-name=A"
139// CHECK:                ],
140// CHECK:                "input-file": "[[PREFIX]]/tu3.m"
141// CHECK-NEXT:         }
142// CHECK:            ]
143// CHECK:          }
144
145// RUN: %deps-to-rsp %t/result.json --tu-index=0 > %t/tu1.rsp
146// RUN: %clang @%t/tu1.rsp
147
148// RUN: %deps-to-rsp %t/result.json --tu-index=1 > %t/tu2.rsp
149// RUN: %clang @%t/tu2.rsp
150
151// RUN: %deps-to-rsp %t/result.json --module-name A > %t/A.rsp
152// RUN: %deps-to-rsp %t/result.json --module-name B > %t/B.rsp
153// RUN: %deps-to-rsp %t/result.json --tu-index=2 > %t/tu3.rsp
154// RUN: %clang @%t/A.rsp
155// RUN: %clang @%t/B.rsp
156// RUN: %clang @%t/tu3.rsp -verify
157