blob: 8d701da5b0b2bc78832557f76d3b7517745f4def [file] [log] [blame]
Nico Weber2ca4be92016-03-01 23:16:44 +00001// Note: %s and %S must be preceded by --, otherwise it may be interpreted as a
2// command-line option, e.g. on Mac where %s is commonly under /Users.
3
4// /Yc
Nico Weber381ec2a2016-03-04 21:59:42 +00005// RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +00006// RUN: | FileCheck -check-prefix=CHECK-YC %s
7// 1. Build .pch file.
8// CHECK-YC: cc1
9// CHECK-YC: -emit-pch
10// CHECK-YC: -o
11// CHECK-YC: pchfile.pch
12// CHECK-YC: -x
13// CHECK-YC: "c++"
14// 2. Use .pch file.
15// CHECK-YC: cc1
16// CHECK-YC: -emit-obj
17// CHECK-YC: -include-pch
18// CHECK-YC: pchfile.pch
19
20// /Yc /Fo
21// /Fo overrides the .obj output filename, but not the .pch filename
Nico Weber381ec2a2016-03-04 21:59:42 +000022// RUN: %clang_cl -Werror /Fomyobj.obj /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000023// RUN: | FileCheck -check-prefix=CHECK-YCO %s
24// 1. Build .pch file.
25// CHECK-YCO: cc1
26// CHECK-YCO: -emit-pch
27// CHECK-YCO: -o
28// CHECK-YCO: pchfile.pch
29// 2. Use .pch file.
30// CHECK-YCO: cc1
31// CHECK-YCO: -emit-obj
32// CHECK-YCO: -include-pch
33// CHECK-YCO: pchfile.pch
34// CHECK-YCO: -o
35// CHECK-YCO: myobj.obj
36
37// /Yc /Y-
38// /Y- disables pch generation
Nico Weber381ec2a2016-03-04 21:59:42 +000039// RUN: %clang_cl -Werror /Y- /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000040// RUN: | FileCheck -check-prefix=CHECK-YC-Y_ %s
41// CHECK-YC-Y_-NOT: -emit-pch
42// CHECK-YC-Y_-NOT: -include-pch
43
44// /Yu
Nico Weber381ec2a2016-03-04 21:59:42 +000045// RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000046// RUN: | FileCheck -check-prefix=CHECK-YU %s
47// Use .pch file, but don't build it.
48// CHECK-YU-NOT: -emit-pch
49// CHECK-YU: cc1
50// CHECK-YU: -emit-obj
51// CHECK-YU: -include-pch
52// CHECK-YU: pchfile.pch
53
54// /Yu /Y-
Nico Weber381ec2a2016-03-04 21:59:42 +000055// RUN: %clang_cl -Werror /Y- /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000056// RUN: | FileCheck -check-prefix=CHECK-YU-Y_ %s
57// CHECK-YU-Y_-NOT: -emit-pch
58// CHECK-YU-Y_-NOT: -include-pch
59
60// /Yc /Yu -- /Yc overrides /Yc if they both refer to the same file
Nico Weber381ec2a2016-03-04 21:59:42 +000061// RUN: %clang_cl -Werror /Ycpchfile.h /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000062// RUN: | FileCheck -check-prefix=CHECK-YC-YU %s
63// 1. Build .pch file.
64// CHECK-YC-YU: cc1
65// CHECK-YC-YU: -emit-pch
66// CHECK-YC-YU: -o
67// CHECK-YC-YU: pchfile.pch
68// 2. Use .pch file.
69// CHECK-YC-YU: cc1
70// CHECK-YC-YU: -emit-obj
71// CHECK-YC-YU: -include-pch
72// CHECK-YC-YU: pchfile.pch
73
74// If /Yc /Yu refer to different files, semantics are pretty wonky. Since this
75// doesn't seem like something that's important in practice, just punt for now.
Nico Weber381ec2a2016-03-04 21:59:42 +000076// RUN: %clang_cl -Werror /Ycfoo1.h /Yufoo2.h /FIfoo1.h /FIfoo2.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000077// RUN: | FileCheck -check-prefix=CHECK-YC-YU-MISMATCH %s
78// CHECK-YC-YU-MISMATCH: error: support for '/Yc' and '/Yu' with different filenames not implemented yet; flags ignored
79
80// Similarly, punt on /Yc with more than one input file.
Nico Weber381ec2a2016-03-04 21:59:42 +000081// RUN: %clang_cl -Werror /Ycfoo1.h /FIfoo1.h /c -### -- %s %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000082// RUN: | FileCheck -check-prefix=CHECK-YC-MULTIINPUT %s
83// CHECK-YC-MULTIINPUT: error: support for '/Yc' with more than one source file not implemented yet; flag ignored
84
85// /Yc /Yu /Y-
Nico Weber381ec2a2016-03-04 21:59:42 +000086// RUN: %clang_cl -Werror /Ycpchfile.h /Yupchfile.h /FIpchfile.h /Y- /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000087// RUN: | FileCheck -check-prefix=CHECK-YC-YU-Y_ %s
88// CHECK-YC-YU-Y_-NOT: -emit-pch
89// CHECK-YC-YU-Y_-NOT: -include-pch
90
91// Test computation of pch filename in various cases.
92
93// /Yu /Fpout.pch => out.pch is filename
Nico Weber381ec2a2016-03-04 21:59:42 +000094// RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.pch /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +000095// RUN: | FileCheck -check-prefix=CHECK-YUFP1 %s
96// Use .pch file, but don't build it.
97// CHECK-YUFP1: -include-pch
98// CHECK-YUFP1: out.pch
99
100// /Yu /Fpout => out.pch is filename (.pch gets added if no extension present)
Nico Weber381ec2a2016-03-04 21:59:42 +0000101// RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.pch /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000102// RUN: | FileCheck -check-prefix=CHECK-YUFP2 %s
103// Use .pch file, but don't build it.
104// CHECK-YUFP2: -include-pch
105// CHECK-YUFP2: out.pch
106
107// /Yu /Fpout.bmp => out.bmp is filename (.pch not added when extension present)
Nico Weber381ec2a2016-03-04 21:59:42 +0000108// RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.bmp /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000109// RUN: | FileCheck -check-prefix=CHECK-YUFP3 %s
110// Use .pch file, but don't build it.
111// CHECK-YUFP3: -include-pch
112// CHECK-YUFP3: out.bmp
113
114// /Yusub/dir.h => sub/dir.pch
Nico Weber381ec2a2016-03-04 21:59:42 +0000115// RUN: %clang_cl -Werror /Yusub/pchfile.h /FIsub/pchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000116// RUN: | FileCheck -check-prefix=CHECK-YUFP4 %s
117// Use .pch file, but don't build it.
118// CHECK-YUFP4: -include-pch
119// CHECK-YUFP4: sub/pchfile.pch
120
121// /Yudir.h /Isub => dir.pch
Nico Weber381ec2a2016-03-04 21:59:42 +0000122// RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Isub /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000123// RUN: | FileCheck -check-prefix=CHECK-YUFP5 %s
124// Use .pch file, but don't build it.
125// CHECK-YUFP5: -include-pch
126// CHECK-YUFP5: pchfile.pch
127
128// FIXME: /Fpdir: use dir/VCx0.pch when dir is directory, where x is major MSVS
129// version in use.
130
131// Spot-check one use of /Fp with /Yc too, else trust the /Yu test cases above
132// also all assume to /Yc.
Nico Weber381ec2a2016-03-04 21:59:42 +0000133// RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /Fpsub/file.pch /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000134// RUN: | FileCheck -check-prefix=CHECK-YCFP %s
135// 1. Build .pch file.
136// CHECK-YCFP: cc1
137// CHECK-YCFP: -emit-pch
138// CHECK-YCFP: -o
139// CHECK-YCFP: sub/file.pch
140// 2. Use .pch file.
141// CHECK-YCFP: cc1
142// CHECK-YCFP: -emit-obj
143// CHECK-YCFP: -include-pch
144// CHECK-YCFP: sub/file.pch
145
146// /Ycfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h
147// => foo1 and foo2 go into pch, foo3 into main compilation
148// /Yc
Nico Weber381ec2a2016-03-04 21:59:42 +0000149// RUN: %clang_cl -Werror /Ycfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000150// RUN: | FileCheck -check-prefix=CHECK-YCFIFIFI %s
151// 1. Build .pch file: Includes foo1.h (but NOT foo3.h) and compiles foo2.h
152// CHECK-YCFIFIFI: cc1
153// CHECK-YCFIFIFI: -emit-pch
154// CHECK-YCFIFIFI: -include
155// CHECK-YCFIFIFI: foo1.h
156// CHECK-YCFIFIFI-NOT: foo2.h
157// CHECK-YCFIFIFI-NOT: foo3.h
158// CHECK-YCFIFIFI: -o
159// CHECK-YCFIFIFI: foo2.pch
160// CHECK-YCFIFIFI: -x
161// CHECK-YCFIFIFI: "c++"
162// CHECK-YCFIFIFI: foo2.h
163// 2. Use .pch file: Inlucdes foo2.pch and foo3.h
164// CHECK-YCFIFIFI: cc1
165// CHECK-YCFIFIFI: -emit-obj
166// CHECK-YCFIFIFI-NOT: foo1.h
167// CHECK-YCFIFIFI-NOT: foo2.h
168// CHECK-YCFIFIFI: -include-pch
169// CHECK-YCFIFIFI: foo2.pch
170// CHECK-YCFIFIFI: -include
171// CHECK-YCFIFIFI: foo3.h
172
173// /Yucfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h
174// => foo1 foo2 filtered out, foo3 into main compilation
Nico Weber381ec2a2016-03-04 21:59:42 +0000175// RUN: %clang_cl -Werror /Yufoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000176// RUN: | FileCheck -check-prefix=CHECK-YUFIFIFI %s
177// Use .pch file, but don't build it.
178// CHECK-YUFIFIFI-NOT: -emit-pch
179// CHECK-YUFIFIFI: cc1
180// CHECK-YUFIFIFI: -emit-obj
181// CHECK-YUFIFIFI-NOT: foo1.h
182// CHECK-YUFIFIFI-NOT: foo2.h
183// CHECK-YUFIFIFI: -include-pch
184// CHECK-YUFIFIFI: foo2.pch
185// CHECK-YUFIFIFI: -include
186// CHECK-YUFIFIFI: foo3.h
187
188// FIXME: Implement support for /Ycfoo.h / /Yufoo.h without /FIfoo.h
Nico Weber381ec2a2016-03-04 21:59:42 +0000189// RUN: %clang_cl -Werror /Ycfoo.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000190// RUN: | FileCheck -check-prefix=CHECK-YC-NOFI %s
191// CHECK-YC-NOFI: error: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
Nico Weber381ec2a2016-03-04 21:59:42 +0000192// RUN: %clang_cl -Werror /Yufoo.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000193// RUN: | FileCheck -check-prefix=CHECK-YU-NOFI %s
194// CHECK-YU-NOFI: error: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
195
196// /Yc and /FI relative to /I paths...
197// The rules are:
198// Yu/Yc and FI parameter must match exactly, else it's not found
199// Must match literally exactly: /FI./foo.h /Ycfoo.h does _not_ work.
200// However, the path can be relative to /I paths.
201// FIXME: Update the error messages below once /FI is no longer required, but
202// these test cases all should stay failures as they fail with cl.exe.
203
204// Check that ./ isn't canonicalized away.
Nico Weber381ec2a2016-03-04 21:59:42 +0000205// RUN: %clang_cl -Werror /Ycpchfile.h /FI./pchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000206// RUN: | FileCheck -check-prefix=CHECK-YC-I1 %s
207// CHECK-YC-I1: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
208
209// Check that ./ isn't canonicalized away.
Nico Weber381ec2a2016-03-04 21:59:42 +0000210// RUN: %clang_cl -Werror /Yc./pchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000211// RUN: | FileCheck -check-prefix=CHECK-YC-I2 %s
212// CHECK-YC-I2: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
213
214// With an actual /I argument.
Nico Weber381ec2a2016-03-04 21:59:42 +0000215// RUN: %clang_cl -Werror /Ifoo /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000216// RUN: | FileCheck -check-prefix=CHECK-YC-I3 %s
217// 1. This writes pchfile.pch into the root dir, even if this will pick up
218// foo/pchfile.h
219// CHECK-YC-I3: cc1
220// CHECK-YC-I3: -emit-pch
221// CHECK-YC-I3: -o
222// CHECK-YC-I3: pchfile.pch
223// 2. Use .pch file.
224// CHECK-YC-I3: cc1
225// CHECK-YC-I3: -emit-obj
226// CHECK-YC-I3: -include-pch
227// CHECK-YC-I3: pchfile.pch
228
229// Check that ./ isn't canonicalized away for /Yu either.
Nico Weber381ec2a2016-03-04 21:59:42 +0000230// RUN: %clang_cl -Werror /Yupchfile.h /FI./pchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000231// RUN: | FileCheck -check-prefix=CHECK-YU-I1 %s
232// CHECK-YU-I1: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
233
234// But /FIfoo/bar.h /Ycfoo\bar.h does work, as does /FIfOo.h /Ycfoo.H
235// FIXME: This part isn't implemented yet. The following two tests should not
236// show an error but do regular /Yu handling.
Nico Weber381ec2a2016-03-04 21:59:42 +0000237// RUN: %clang_cl -Werror /YupchFILE.h /FI./pchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000238// RUN: | FileCheck -check-prefix=CHECK-YU-CASE %s
239// CHECK-YU-CASE: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
Nico Weber381ec2a2016-03-04 21:59:42 +0000240// RUN: %clang_cl -Werror /Yu./pchfile.h /FI.\pchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000241// RUN: | FileCheck -check-prefix=CHECK-YU-SLASH %s
242// CHECK-YU-SLASH: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
243
244// cl.exe warns on multiple /Yc, /Yu, /Fp arguments, but clang-cl silently just
245// uses the last one. This is true for e.g. /Fo too, so not warning on this
246// is self-consistent with clang-cl's flag handling.
247
248// Interaction with /fallback
249
250// /Yc /fallback => /Yc not passed on (but /FI is)
Nico Weber381ec2a2016-03-04 21:59:42 +0000251// RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /Fpfoo.pch /fallback /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000252// RUN: | FileCheck -check-prefix=CHECK-YC-FALLBACK %s
253// Note that in /fallback builds, if creation of the pch fails the main compile
254// does still run so that /fallback can have an effect (this part is not tested)
255// CHECK-YC-FALLBACK: cc1
256// CHECK-YC-FALLBACK: -emit-obj
257// CHECK-YC-FALLBACK: -include-pch
258// CHECK-YC-FALLBACK: foo.pch
259// CHECK-YC-FALLBACK: ||
260// CHECK-YC-FALLBACK: cl.exe
261// CHECK-YC-FALLBACK-NOT: -include-pch
262// CHECK-YC-FALLBACK-NOT: /Ycpchfile.h
263// CHECK-YC-FALLBACK: /FIpchfile.h
264// CHECK-YC-FALLBACK-NOT: /Fpfoo.pch
265
266// /Yu /fallback => /Yu not passed on (but /FI is)
Nico Weber381ec2a2016-03-04 21:59:42 +0000267// RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpfoo.pch /fallback /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000268// RUN: | FileCheck -check-prefix=CHECK-YU-FALLBACK %s
269// CHECK-YU-FALLBACK-NOT: -emit-pch
270// CHECK-YU-FALLBACK: cc1
271// CHECK-YU-FALLBACK: -emit-obj
272// CHECK-YU-FALLBACK: -include-pch
273// CHECK-YU-FALLBACK: foo.pch
274// CHECK-YU-FALLBACK: ||
275// CHECK-YU-FALLBACK: cl.exe
276// CHECK-YU-FALLBACK-NOT: -include-pch
277// CHECK-YU-FALLBACK-NOT: /Yupchfile.h
278// CHECK-YU-FALLBACK: /FIpchfile.h
279// CHECK-YU-FALLBACK-NOT: /Fpfoo.pch
280
281// /FI without /Yu => pch file not used, even if it exists (different from
282// -include, which picks up .gch files if they exist).
283// RUN: touch %t.pch
Nico Weber381ec2a2016-03-04 21:59:42 +0000284// RUN: %clang_cl -Werror /FI%t.pch /Fp%t.pch /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000285// RUN: | FileCheck -check-prefix=CHECK-FI %s
286// CHECK-FI-NOT: -include-pch
287// CHECK-FI: -include
288
289// Test interaction of /Yc with language mode flags.
290
291// If /TC changes the input language to C, a c pch file should be produced.
Nico Weber381ec2a2016-03-04 21:59:42 +0000292// RUN: %clang_cl /TC -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000293// RUN: | FileCheck -check-prefix=CHECK-YCTC %s
294// CHECK-YCTC: cc1
295// CHECK-YCTC: -emit-pch
296// CHECK-YCTC: -o
297// CHECK-YCTC: pchfile.pch
298// CHECK-YCTC: -x
Nico Weberad2d8f32016-04-21 19:59:10 +0000299// CHECK-YCTC: "c"
Nico Weber2ca4be92016-03-01 23:16:44 +0000300
301// Also check lower-case /Tc variant.
Nico Weber381ec2a2016-03-04 21:59:42 +0000302// RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### /Tc%s 2>&1 \
Nico Weber2ca4be92016-03-01 23:16:44 +0000303// RUN: | FileCheck -check-prefix=CHECK-YCTc %s
304// CHECK-YCTc: cc1
305// CHECK-YCTc: -emit-pch
306// CHECK-YCTc: -o
307// CHECK-YCTc: pchfile.pch
308// CHECK-YCTc: -x
309// CHECK-YCTc: "c"
Nico Weberad2d8f32016-04-21 19:59:10 +0000310
311// Don't crash when a non-source file is passed.
Nico Weber37960932016-04-22 00:38:09 +0000312// RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %S/Inputs/file.prof 2>&1 \
Nico Weberad2d8f32016-04-21 19:59:10 +0000313// RUN: | FileCheck -check-prefix=CHECK-NoSource %s
314// CHECK-NoSource: file.prof:{{.*}}input unused
315
316// ...but if an explicit file turns the file into a source file, handle it:
Nico Weber37960932016-04-22 00:38:09 +0000317// RUN: %clang_cl /TP -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %S/Inputs/file.prof 2>&1 \
Nico Weberad2d8f32016-04-21 19:59:10 +0000318// RUN: | FileCheck -check-prefix=CHECK-NoSourceTP %s
319// CHECK-NoSourceTP: cc1
320// CHECK-NoSourceTP: -emit-pch
321// CHECK-NoSourceTP: -o
322// CHECK-NoSourceTP: pchfile.pch
323// CHECK-NoSourceTP: -x
324// CHECK-NoSourceTP: "c++"