xref: /aosp_15_r20/external/clang/test/Driver/cl-pch.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // Note: %s and %S must be preceded by --, otherwise it may be interpreted as a
2*67e74705SXin Li // command-line option, e.g. on Mac where %s is commonly under /Users.
3*67e74705SXin Li 
4*67e74705SXin Li // /Yc
5*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
6*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC %s
7*67e74705SXin Li // 1. Build .pch file.
8*67e74705SXin Li // CHECK-YC: cc1
9*67e74705SXin Li // CHECK-YC: -emit-pch
10*67e74705SXin Li // CHECK-YC: -o
11*67e74705SXin Li // CHECK-YC: pchfile.pch
12*67e74705SXin Li // CHECK-YC: -x
13*67e74705SXin Li // CHECK-YC: "c++"
14*67e74705SXin Li // 2. Use .pch file.
15*67e74705SXin Li // CHECK-YC: cc1
16*67e74705SXin Li // CHECK-YC: -emit-obj
17*67e74705SXin Li // CHECK-YC: -include-pch
18*67e74705SXin Li // CHECK-YC: pchfile.pch
19*67e74705SXin Li 
20*67e74705SXin Li // /Yc /Fo
21*67e74705SXin Li // /Fo overrides the .obj output filename, but not the .pch filename
22*67e74705SXin Li // RUN: %clang_cl -Werror /Fomyobj.obj /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
23*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YCO %s
24*67e74705SXin Li // 1. Build .pch file.
25*67e74705SXin Li // CHECK-YCO: cc1
26*67e74705SXin Li // CHECK-YCO: -emit-pch
27*67e74705SXin Li // CHECK-YCO: -o
28*67e74705SXin Li // CHECK-YCO: pchfile.pch
29*67e74705SXin Li // 2. Use .pch file.
30*67e74705SXin Li // CHECK-YCO: cc1
31*67e74705SXin Li // CHECK-YCO: -emit-obj
32*67e74705SXin Li // CHECK-YCO: -include-pch
33*67e74705SXin Li // CHECK-YCO: pchfile.pch
34*67e74705SXin Li // CHECK-YCO: -o
35*67e74705SXin Li // CHECK-YCO: myobj.obj
36*67e74705SXin Li 
37*67e74705SXin Li // /Yc /Y-
38*67e74705SXin Li // /Y- disables pch generation
39*67e74705SXin Li // RUN: %clang_cl -Werror /Y- /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
40*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-Y_ %s
41*67e74705SXin Li // CHECK-YC-Y_-NOT: -emit-pch
42*67e74705SXin Li // CHECK-YC-Y_-NOT: -include-pch
43*67e74705SXin Li 
44*67e74705SXin Li // /Yu
45*67e74705SXin Li // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
46*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YU %s
47*67e74705SXin Li // Use .pch file, but don't build it.
48*67e74705SXin Li // CHECK-YU-NOT: -emit-pch
49*67e74705SXin Li // CHECK-YU: cc1
50*67e74705SXin Li // CHECK-YU: -emit-obj
51*67e74705SXin Li // CHECK-YU: -include-pch
52*67e74705SXin Li // CHECK-YU: pchfile.pch
53*67e74705SXin Li 
54*67e74705SXin Li // /Yu /Y-
55*67e74705SXin Li // RUN: %clang_cl -Werror /Y- /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
56*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YU-Y_ %s
57*67e74705SXin Li // CHECK-YU-Y_-NOT: -emit-pch
58*67e74705SXin Li // CHECK-YU-Y_-NOT: -include-pch
59*67e74705SXin Li 
60*67e74705SXin Li // /Yc /Yu -- /Yc overrides /Yc if they both refer to the same file
61*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
62*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-YU %s
63*67e74705SXin Li // 1. Build .pch file.
64*67e74705SXin Li // CHECK-YC-YU: cc1
65*67e74705SXin Li // CHECK-YC-YU: -emit-pch
66*67e74705SXin Li // CHECK-YC-YU: -o
67*67e74705SXin Li // CHECK-YC-YU: pchfile.pch
68*67e74705SXin Li // 2. Use .pch file.
69*67e74705SXin Li // CHECK-YC-YU: cc1
70*67e74705SXin Li // CHECK-YC-YU: -emit-obj
71*67e74705SXin Li // CHECK-YC-YU: -include-pch
72*67e74705SXin Li // CHECK-YC-YU: pchfile.pch
73*67e74705SXin Li 
74*67e74705SXin Li // If /Yc /Yu refer to different files, semantics are pretty wonky.  Since this
75*67e74705SXin Li // doesn't seem like something that's important in practice, just punt for now.
76*67e74705SXin Li // RUN: %clang_cl -Werror /Ycfoo1.h /Yufoo2.h /FIfoo1.h /FIfoo2.h /c -### -- %s 2>&1 \
77*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-YU-MISMATCH %s
78*67e74705SXin Li // CHECK-YC-YU-MISMATCH: error: support for '/Yc' and '/Yu' with different filenames not implemented yet; flags ignored
79*67e74705SXin Li 
80*67e74705SXin Li // Similarly, punt on /Yc with more than one input file.
81*67e74705SXin Li // RUN: %clang_cl -Werror /Ycfoo1.h /FIfoo1.h /c -### -- %s %s 2>&1 \
82*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-MULTIINPUT %s
83*67e74705SXin Li // CHECK-YC-MULTIINPUT: error: support for '/Yc' with more than one source file not implemented yet; flag ignored
84*67e74705SXin Li 
85*67e74705SXin Li // /Yc /Yu /Y-
86*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /Yupchfile.h /FIpchfile.h /Y- /c -### -- %s 2>&1 \
87*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-YU-Y_ %s
88*67e74705SXin Li // CHECK-YC-YU-Y_-NOT: -emit-pch
89*67e74705SXin Li // CHECK-YC-YU-Y_-NOT: -include-pch
90*67e74705SXin Li 
91*67e74705SXin Li // Test computation of pch filename in various cases.
92*67e74705SXin Li 
93*67e74705SXin Li // /Yu /Fpout.pch => out.pch is filename
94*67e74705SXin Li // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.pch /c -### -- %s 2>&1 \
95*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YUFP1 %s
96*67e74705SXin Li // Use .pch file, but don't build it.
97*67e74705SXin Li // CHECK-YUFP1: -include-pch
98*67e74705SXin Li // CHECK-YUFP1: out.pch
99*67e74705SXin Li 
100*67e74705SXin Li // /Yu /Fpout => out.pch is filename (.pch gets added if no extension present)
101*67e74705SXin Li // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.pch /c -### -- %s 2>&1 \
102*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YUFP2 %s
103*67e74705SXin Li // Use .pch file, but don't build it.
104*67e74705SXin Li // CHECK-YUFP2: -include-pch
105*67e74705SXin Li // CHECK-YUFP2: out.pch
106*67e74705SXin Li 
107*67e74705SXin Li // /Yu /Fpout.bmp => out.bmp is filename (.pch not added when extension present)
108*67e74705SXin Li // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.bmp /c -### -- %s 2>&1 \
109*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YUFP3 %s
110*67e74705SXin Li // Use .pch file, but don't build it.
111*67e74705SXin Li // CHECK-YUFP3: -include-pch
112*67e74705SXin Li // CHECK-YUFP3: out.bmp
113*67e74705SXin Li 
114*67e74705SXin Li // /Yusub/dir.h => sub/dir.pch
115*67e74705SXin Li // RUN: %clang_cl -Werror /Yusub/pchfile.h /FIsub/pchfile.h /c -### -- %s 2>&1 \
116*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YUFP4 %s
117*67e74705SXin Li // Use .pch file, but don't build it.
118*67e74705SXin Li // CHECK-YUFP4: -include-pch
119*67e74705SXin Li // CHECK-YUFP4: sub/pchfile.pch
120*67e74705SXin Li 
121*67e74705SXin Li // /Yudir.h /Isub => dir.pch
122*67e74705SXin Li // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Isub /c -### -- %s 2>&1 \
123*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YUFP5 %s
124*67e74705SXin Li // Use .pch file, but don't build it.
125*67e74705SXin Li // CHECK-YUFP5: -include-pch
126*67e74705SXin Li // CHECK-YUFP5: pchfile.pch
127*67e74705SXin Li 
128*67e74705SXin Li // FIXME: /Fpdir: use dir/VCx0.pch when dir is directory, where x is major MSVS
129*67e74705SXin Li // version in use.
130*67e74705SXin Li 
131*67e74705SXin Li // Spot-check one use of /Fp with /Yc too, else trust the /Yu test cases above
132*67e74705SXin Li // also all assume to /Yc.
133*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /Fpsub/file.pch /c -### -- %s 2>&1 \
134*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YCFP %s
135*67e74705SXin Li // 1. Build .pch file.
136*67e74705SXin Li // CHECK-YCFP: cc1
137*67e74705SXin Li // CHECK-YCFP: -emit-pch
138*67e74705SXin Li // CHECK-YCFP: -o
139*67e74705SXin Li // CHECK-YCFP: sub/file.pch
140*67e74705SXin Li // 2. Use .pch file.
141*67e74705SXin Li // CHECK-YCFP: cc1
142*67e74705SXin Li // CHECK-YCFP: -emit-obj
143*67e74705SXin Li // CHECK-YCFP: -include-pch
144*67e74705SXin Li // CHECK-YCFP: sub/file.pch
145*67e74705SXin Li 
146*67e74705SXin Li // /Ycfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h
147*67e74705SXin Li // => foo1 and foo2 go into pch, foo3 into main compilation
148*67e74705SXin Li // /Yc
149*67e74705SXin Li // RUN: %clang_cl -Werror /Ycfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h /c -### -- %s 2>&1 \
150*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YCFIFIFI %s
151*67e74705SXin Li // 1. Build .pch file: Includes foo1.h (but NOT foo3.h) and compiles foo2.h
152*67e74705SXin Li // CHECK-YCFIFIFI: cc1
153*67e74705SXin Li // CHECK-YCFIFIFI: -emit-pch
154*67e74705SXin Li // CHECK-YCFIFIFI: -include
155*67e74705SXin Li // CHECK-YCFIFIFI: foo1.h
156*67e74705SXin Li // CHECK-YCFIFIFI-NOT: foo2.h
157*67e74705SXin Li // CHECK-YCFIFIFI-NOT: foo3.h
158*67e74705SXin Li // CHECK-YCFIFIFI: -o
159*67e74705SXin Li // CHECK-YCFIFIFI: foo2.pch
160*67e74705SXin Li // CHECK-YCFIFIFI: -x
161*67e74705SXin Li // CHECK-YCFIFIFI: "c++"
162*67e74705SXin Li // CHECK-YCFIFIFI: foo2.h
163*67e74705SXin Li // 2. Use .pch file: Inlucdes foo2.pch and foo3.h
164*67e74705SXin Li // CHECK-YCFIFIFI: cc1
165*67e74705SXin Li // CHECK-YCFIFIFI: -emit-obj
166*67e74705SXin Li // CHECK-YCFIFIFI-NOT: foo1.h
167*67e74705SXin Li // CHECK-YCFIFIFI-NOT: foo2.h
168*67e74705SXin Li // CHECK-YCFIFIFI: -include-pch
169*67e74705SXin Li // CHECK-YCFIFIFI: foo2.pch
170*67e74705SXin Li // CHECK-YCFIFIFI: -include
171*67e74705SXin Li // CHECK-YCFIFIFI: foo3.h
172*67e74705SXin Li 
173*67e74705SXin Li // /Yucfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h
174*67e74705SXin Li // => foo1 foo2 filtered out, foo3 into main compilation
175*67e74705SXin Li // RUN: %clang_cl -Werror /Yufoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h /c -### -- %s 2>&1 \
176*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YUFIFIFI %s
177*67e74705SXin Li // Use .pch file, but don't build it.
178*67e74705SXin Li // CHECK-YUFIFIFI-NOT: -emit-pch
179*67e74705SXin Li // CHECK-YUFIFIFI: cc1
180*67e74705SXin Li // CHECK-YUFIFIFI: -emit-obj
181*67e74705SXin Li // CHECK-YUFIFIFI-NOT: foo1.h
182*67e74705SXin Li // CHECK-YUFIFIFI-NOT: foo2.h
183*67e74705SXin Li // CHECK-YUFIFIFI: -include-pch
184*67e74705SXin Li // CHECK-YUFIFIFI: foo2.pch
185*67e74705SXin Li // CHECK-YUFIFIFI: -include
186*67e74705SXin Li // CHECK-YUFIFIFI: foo3.h
187*67e74705SXin Li 
188*67e74705SXin Li // FIXME: Implement support for /Ycfoo.h / /Yufoo.h without /FIfoo.h
189*67e74705SXin Li // RUN: %clang_cl -Werror /Ycfoo.h /c -### -- %s 2>&1 \
190*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-NOFI %s
191*67e74705SXin Li // CHECK-YC-NOFI: error: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
192*67e74705SXin Li // RUN: %clang_cl -Werror /Yufoo.h /c -### -- %s 2>&1 \
193*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YU-NOFI %s
194*67e74705SXin Li // CHECK-YU-NOFI: error: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
195*67e74705SXin Li 
196*67e74705SXin Li // /Yc and /FI relative to /I paths...
197*67e74705SXin Li // The rules are:
198*67e74705SXin Li // Yu/Yc and FI parameter must match exactly, else it's not found
199*67e74705SXin Li // Must match literally exactly: /FI./foo.h /Ycfoo.h does _not_ work.
200*67e74705SXin Li // However, the path can be relative to /I paths.
201*67e74705SXin Li // FIXME: Update the error messages below once /FI is no longer required, but
202*67e74705SXin Li // these test cases all should stay failures as they fail with cl.exe.
203*67e74705SXin Li 
204*67e74705SXin Li // Check that ./ isn't canonicalized away.
205*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /FI./pchfile.h /c -### -- %s 2>&1 \
206*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-I1 %s
207*67e74705SXin Li // CHECK-YC-I1: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
208*67e74705SXin Li 
209*67e74705SXin Li // Check that ./ isn't canonicalized away.
210*67e74705SXin Li // RUN: %clang_cl -Werror /Yc./pchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
211*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-I2 %s
212*67e74705SXin Li // CHECK-YC-I2: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
213*67e74705SXin Li 
214*67e74705SXin Li // With an actual /I argument.
215*67e74705SXin Li // RUN: %clang_cl -Werror /Ifoo /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
216*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-I3 %s
217*67e74705SXin Li // 1. This writes pchfile.pch into the root dir, even if this will pick up
218*67e74705SXin Li //    foo/pchfile.h
219*67e74705SXin Li // CHECK-YC-I3: cc1
220*67e74705SXin Li // CHECK-YC-I3: -emit-pch
221*67e74705SXin Li // CHECK-YC-I3: -o
222*67e74705SXin Li // CHECK-YC-I3: pchfile.pch
223*67e74705SXin Li // 2. Use .pch file.
224*67e74705SXin Li // CHECK-YC-I3: cc1
225*67e74705SXin Li // CHECK-YC-I3: -emit-obj
226*67e74705SXin Li // CHECK-YC-I3: -include-pch
227*67e74705SXin Li // CHECK-YC-I3: pchfile.pch
228*67e74705SXin Li 
229*67e74705SXin Li // Check that ./ isn't canonicalized away for /Yu either.
230*67e74705SXin Li // RUN: %clang_cl -Werror /Yupchfile.h /FI./pchfile.h /c -### -- %s 2>&1 \
231*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YU-I1 %s
232*67e74705SXin Li // CHECK-YU-I1: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
233*67e74705SXin Li 
234*67e74705SXin Li // But /FIfoo/bar.h /Ycfoo\bar.h does work, as does /FIfOo.h /Ycfoo.H
235*67e74705SXin Li // FIXME: This part isn't implemented yet. The following two tests should not
236*67e74705SXin Li // show an error but do regular /Yu handling.
237*67e74705SXin Li // RUN: %clang_cl -Werror /YupchFILE.h /FI./pchfile.h /c -### -- %s 2>&1 \
238*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YU-CASE %s
239*67e74705SXin Li // CHECK-YU-CASE: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
240*67e74705SXin Li // RUN: %clang_cl -Werror /Yu./pchfile.h /FI.\pchfile.h /c -### -- %s 2>&1 \
241*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YU-SLASH %s
242*67e74705SXin Li // CHECK-YU-SLASH: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
243*67e74705SXin Li 
244*67e74705SXin Li // cl.exe warns on multiple /Yc, /Yu, /Fp arguments, but clang-cl silently just
245*67e74705SXin Li // uses the last one.  This is true for e.g. /Fo too, so not warning on this
246*67e74705SXin Li // is self-consistent with clang-cl's flag handling.
247*67e74705SXin Li 
248*67e74705SXin Li // Interaction with /fallback
249*67e74705SXin Li 
250*67e74705SXin Li // /Yc /fallback => /Yc not passed on (but /FI is)
251*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /Fpfoo.pch /fallback /c -### -- %s 2>&1 \
252*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YC-FALLBACK %s
253*67e74705SXin Li // Note that in /fallback builds, if creation of the pch fails the main compile
254*67e74705SXin Li // does still run so that /fallback can have an effect (this part is not tested)
255*67e74705SXin Li // CHECK-YC-FALLBACK: cc1
256*67e74705SXin Li // CHECK-YC-FALLBACK: -emit-obj
257*67e74705SXin Li // CHECK-YC-FALLBACK: -include-pch
258*67e74705SXin Li // CHECK-YC-FALLBACK: foo.pch
259*67e74705SXin Li // CHECK-YC-FALLBACK: ||
260*67e74705SXin Li // CHECK-YC-FALLBACK: cl.exe
261*67e74705SXin Li // CHECK-YC-FALLBACK-NOT: -include-pch
262*67e74705SXin Li // CHECK-YC-FALLBACK-NOT: /Ycpchfile.h
263*67e74705SXin Li // CHECK-YC-FALLBACK: /FIpchfile.h
264*67e74705SXin Li // CHECK-YC-FALLBACK-NOT: /Fpfoo.pch
265*67e74705SXin Li 
266*67e74705SXin Li // /Yu /fallback => /Yu not passed on (but /FI is)
267*67e74705SXin Li // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpfoo.pch /fallback /c -### -- %s 2>&1 \
268*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YU-FALLBACK %s
269*67e74705SXin Li // CHECK-YU-FALLBACK-NOT: -emit-pch
270*67e74705SXin Li // CHECK-YU-FALLBACK: cc1
271*67e74705SXin Li // CHECK-YU-FALLBACK: -emit-obj
272*67e74705SXin Li // CHECK-YU-FALLBACK: -include-pch
273*67e74705SXin Li // CHECK-YU-FALLBACK: foo.pch
274*67e74705SXin Li // CHECK-YU-FALLBACK: ||
275*67e74705SXin Li // CHECK-YU-FALLBACK: cl.exe
276*67e74705SXin Li // CHECK-YU-FALLBACK-NOT: -include-pch
277*67e74705SXin Li // CHECK-YU-FALLBACK-NOT: /Yupchfile.h
278*67e74705SXin Li // CHECK-YU-FALLBACK: /FIpchfile.h
279*67e74705SXin Li // CHECK-YU-FALLBACK-NOT: /Fpfoo.pch
280*67e74705SXin Li 
281*67e74705SXin Li // /FI without /Yu => pch file not used, even if it exists (different from
282*67e74705SXin Li // -include, which picks up .gch files if they exist).
283*67e74705SXin Li // RUN: touch %t.pch
284*67e74705SXin Li // RUN: %clang_cl -Werror /FI%t.pch /Fp%t.pch /c -### -- %s 2>&1 \
285*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-FI %s
286*67e74705SXin Li // CHECK-FI-NOT: -include-pch
287*67e74705SXin Li // CHECK-FI: -include
288*67e74705SXin Li 
289*67e74705SXin Li // Test interaction of /Yc with language mode flags.
290*67e74705SXin Li 
291*67e74705SXin Li // If /TC changes the input language to C, a c pch file should be produced.
292*67e74705SXin Li // RUN: %clang_cl /TC -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
293*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YCTC %s
294*67e74705SXin Li // CHECK-YCTC: cc1
295*67e74705SXin Li // CHECK-YCTC: -emit-pch
296*67e74705SXin Li // CHECK-YCTC: -o
297*67e74705SXin Li // CHECK-YCTC: pchfile.pch
298*67e74705SXin Li // CHECK-YCTC: -x
299*67e74705SXin Li // CHECK-YCTC: "c"
300*67e74705SXin Li 
301*67e74705SXin Li // Also check lower-case /Tc variant.
302*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### /Tc%s 2>&1 \
303*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-YCTc %s
304*67e74705SXin Li // CHECK-YCTc: cc1
305*67e74705SXin Li // CHECK-YCTc: -emit-pch
306*67e74705SXin Li // CHECK-YCTc: -o
307*67e74705SXin Li // CHECK-YCTc: pchfile.pch
308*67e74705SXin Li // CHECK-YCTc: -x
309*67e74705SXin Li // CHECK-YCTc: "c"
310*67e74705SXin Li 
311*67e74705SXin Li // Don't crash when a non-source file is passed.
312*67e74705SXin Li // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %S/Inputs/file.prof 2>&1 \
313*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-NoSource %s
314*67e74705SXin Li // CHECK-NoSource: file.prof:{{.*}}input unused
315*67e74705SXin Li 
316*67e74705SXin Li // ...but if an explicit file turns the file into a source file, handle it:
317*67e74705SXin Li // RUN: %clang_cl /TP -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %S/Inputs/file.prof 2>&1 \
318*67e74705SXin Li // RUN:   | FileCheck -check-prefix=CHECK-NoSourceTP %s
319*67e74705SXin Li // CHECK-NoSourceTP: cc1
320*67e74705SXin Li // CHECK-NoSourceTP: -emit-pch
321*67e74705SXin Li // CHECK-NoSourceTP: -o
322*67e74705SXin Li // CHECK-NoSourceTP: pchfile.pch
323*67e74705SXin Li // CHECK-NoSourceTP: -x
324*67e74705SXin Li // CHECK-NoSourceTP: "c++"
325